gpt4 book ai didi

c++ - std::is_same 结果与左值和右值引用

转载 作者:太空狗 更新时间:2023-10-29 20:37:28 26 4
gpt4 key购买 nike

我在将 std::is_same 效用函数与右值和左值引用结合使用时遇到了一个奇怪的行为。

考虑这个检查变量 t 类型的函数模板。

我正在使用 VS 2013:

struct Test {};

template < class T> void h(T && t)
{
cout << " Is type &&: " << std::is_same<decltype(t), T &&>::value << endl;
cout << " Is type &: " << std::is_same<decltype(t), T &>::value << endl;
}

我观察到以下输出:

h(Test()); // is type && : 1  is type & : 0

现在这是正常的,因为 Test() 是一个临时对象,h 参数中的通用引用解析为 r 值引用 (&& && = &&)

但考虑一下:

Test myTest;
h(myTest); // is type && : 1 is type & : 1 !!!

同样的结果,如果我写:

Test &myTest = Test():
h(myTest); // is type && : 1 is type & : 1 !!!

和 :

Test &&myTest = Test():
h(myTest); // is type && : 1 is type & : 1 !!!

我错过了什么吗?对我来说,这看起来一团糟:) VS 2013 是否不完全支持右值引用/decltype 功能?

谢谢你的帮助

罗曼

最佳答案

罗曼,这很容易。让我们考虑以下情况:

Test myTest;
h(myTest); // is type && : 1 is type & : 1 !!!

在h里面,T是Test& , t 的类型是 Test& && , 即 Test& .当你做测试时,std::is_same<decltype(t), T &&>是真的,因为 Test& &&Test& , 和 t类型是 Test& .

std::is_same<decltype(t), T &>也是如此,因为 t类型是 Test& , 和 T&Test&& ,即 Test& .

仔细应用引用折叠规则会有所帮助。

关于为什么在 h() T 内部的类型是 Test& .原因是它是唯一匹配实际参数的 T 类型。 T 不能简单地是 Test , 因为 Test&& 不会绑定(bind)(匹配) Test 类型的左值(因为这是参数类型)。然而,Test& &&会的,因为引用折叠规则。

关于c++ - std::is_same 结果与左值和右值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34659644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com