c – 带有左值和右值参考的std :: is_same结果

我正在使用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&amp ;; &&,即Test&amp ;.当你进行测试时,std :: is_same< decltype(t),T&&>是的,因为Test& &安培;&安培;是Test&,t type是Test&.

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

仔细应用参考折叠规则有助于此.

有点为什么内部h()T是Test&类型.原因是它是唯一与实际参数匹配的T类型. T不能简单地测试,因为测试&&不会绑定(匹配)Test类型的左值(因为这是参数类型).然而,测试& &安培;&安培;将,因为参考折叠规则.

上一篇:c – decltype错误C2440无法从’int *’转换为’int *&’


下一篇:c – 在decltype()或operator noexcept()上下文中使用new new on nullptr