我正在使用std :: is_same实用程序函数与rvalue和左值引用相结合,并遇到了一个奇怪的行为.
考虑这个函数模板,它检查变量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中是否完全支持rvalue reference / 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 type是Test&.
std :: is_same< decltype(t),T&>也是如此,因为t型是Test&和T&是Test&&,它是Test& ;.
仔细应用参考折叠规则有助于此.
有点为什么内部h()T是Test&类型.原因是它是唯一与实际参数匹配的T类型. T不能简单地测试,因为测试&&不会绑定(匹配)Test类型的左值(因为这是参数类型).然而,测试& &安培;&安培;将,因为参考折叠规则.