0

我知道 std::ref(object) 创建了 std::reference_wrapper(object),并且 std::reference_wrapper 具有非显式类型转换运算符成员函数

operator T&() const

而且我知道这会影响我在模板参数推导发挥作用时使用它的方式:所以在下面的打印中,如果我用 std::ref("你好”)

template <class T>
void Print(T t)
{
    std::cout << t << std::end;
}

为什么这一行不编译?

std::string s = "hello";
std::cout << std::reference_wrapper<std::string>(s) << std::endl;

实例化的特化应该有一个

operator std::string&() const

类型转换函数,那么为什么我不能使用这样的引用包装器呢?

4

1 回答 1

1

您尝试使用的operator<<重载具有以下形式(来自cppreference.com):

template <class CharT, class Traits, class Allocator>

std::basic_ostream<CharT, Traits>&
    operator<<(std::basic_ostream<CharT, Traits>& os,
               const std::basic_string<CharT, Traits, Allocator>& str);

第二个函数参数包含模板参数,不是非推导上下文。因此它必须推导出模板参数。模板参数推导不考虑隐式转换,因为std::reference_wrapperis not a std::basic_string,所以推导将失败。是否std::reference_wrapper可以转换为std::string(或引用)都没有关系。

只是为了澄清,std::string是专业化的std::basic_string<char, std::char_traits<char>, std::allocator<char>>别名std::basic_stringstd::basic_string可以专门用于任何字符类型,例如wchar_t(别名为std::wstring)。其他专业根本不经常使用。

于 2020-04-13T09:39:53.550 回答