繁体   English   中英

std::ref 隐式转换为引用混淆

[英]std::ref implicit conversion to reference confusion

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

operator T&() const

我知道这会影响我在模板参数推导发挥作用时使用它的方式:所以在下面的 Print 中,如果我用 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

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

您尝试使用的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);

第二个 function 参数包含模板参数,不是非推导上下文。 因此必须推导出模板 arguments。 模板参数推导不考虑隐式转换,并且由于std::reference_wrapper不是std::basic_string ,推导将失败。 std::reference_wrapper是否可以转换为std::string (或对其中的引用)并不重要。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM