在《C++ Move Semantics - The Complete Guide,CH8.2》一书中,有这样一个案例,我们需要创建一个带有“引用成员”的std::pair
对象,我就是不知道如何创建这样一个对象,请帮助。
我试过了,但是编译错误。
#include <vector>
#include <string>
#include <utility>
std::pair<std::string, std::string&> foo()
{
static std::string s_s1{ "the~static" };
return std::make_pair(std::string("abc"), s_s1); // compile ERROR!
}
int main()
{
extern std::pair<std::string, std::string&> foo(); // note: member second is reference
std::vector<std::string> coll;
// ...
coll.push_back(foo().first); // moves because first is an xvalue here
coll.push_back(foo().second); // copies because second is an lvalue her
return 0;
}
VC2019喷嘴错误消息:
> cl /EHsc p131.cpp
>
> Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30138 for x64 Copyright (C) Microsoft Corporation. All rights reserved.
>
> p131.cpp
>
> p131.cpp(8): error C2440: 'return': cannot convert from
> **'std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>'** to **'std::pair<std::string,std::string &>'**
>
> p131.cpp(8): note: No constructor could take the source type, or constructor overload
> resolution was ambiguous
1条答案
按热度按时间owfi6suc1#
问题是,任何没有显式模板类型的模板函数,都会从参数中推导出类型,因为
s_s1
是一个std::string
,一个左值,这将是它推导出的类型。如果您显式地使用正确的模板类型,它将工作:
因为我们无论如何都必须命名类型,所以实际上并不需要
std::make_pair
便利函数,所以我直接在上面使用了std::pair
。