c++ std::pair,如何初始化一个“引用成员”?

ttp71kqs  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(190)

在《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
owfi6suc

owfi6suc1#

问题是,任何没有显式模板类型的模板函数,都会从参数中推导出类型,因为s_s1是一个std::string,一个左值,这将是它推导出的类型。
如果您显式地使用正确的模板类型,它将工作:

return std::pair<std::string, std::string&>(std::string("abc"), s_s1);

因为我们无论如何都必须命名类型,所以实际上并不需要std::make_pair便利函数,所以我直接在上面使用了std::pair

相关问题