2017-02-04 38 views
1

在下面的代码中,is_rvalue_reference返回true。 我期望调用testRef(int &&)而不是testRef(int &),但事实并非如此(至少在我的Visual Studio 2015编译器中)。为什么rval ref绑定到lval ref函数?

任何想法的原因是什么?

void testRef(int&& i) 
{ 
    cout << "called testRef(int&&) " << endl; 
} 

void testRef(int& i) 
{ 
    cout << "called testRef(int&) " << endl; 
} 

int main() 
{ 
    int && rvalref = 4; 
    cout << "is rval? : " << std::is_rvalue_reference<decltype(rvalref)>() << endl; 
    testRef(rvalref); 
} 

注意,这是问题的不同之处Rvalue Reference is Treated as an Lvalue?

在那个岗位,他们都在谈论可变功能:这就像问是否在我的例子中,变量i是一个右值或一个左值(答案是它在两种情况下都是左值,因此它在两种情况下都有一个地址)。

有rvalues和std::move,这是一个右值的强制转换,允许在函数和构造函数中选择正确的重载。 例如下面的两个案例解析到一个呼叫testRef(int && i)

int main() 
{ 
    int g = 3; 
    testRef(std::move(g)); 
    testRef(4); 
} 

但随着右值引用它似乎不是如此。

+0

你可以使用一些简化的规则:如果var有一个名字 - 它的左值 –

+0

'rvalref'是一个左值。 'decltype(标识符)'的结果可能与由该标识符组成的表达式的值类别不一样 –

+0

您链接到的问题的答案也会回答您的问题,尽管它是一个稍微不同的问题 –

回答

1

rvalref是对象的标识符。对象的标识符总是左值。

表达式从来没有引用类型。表达式rvalref的类型为int,值类别为“左值”。

在声明int && rvalref,所述&&描述rvalref将如何被初始化(即,通过增加一个新的名字由另一个表达式来表示,而不是创建新的对象的对象),而这一切。

在一个表达式中,对象名称的行为是相同的,无论该名称是否是给予该对象的第一个名称。

代码decltype(identifier)有特殊的行为,与decltype(general_expression)相比。它不给出由该标识符组成的表达式的类型和值类别。代码decltype((identifier))会这样做。 Further reading