【发布时间】:2012-01-12 19:46:04
【问题描述】:
#include<iostream>
template<class T>
struct Foo
{
T v_;
Foo(T&& v):v_(std::forward<T>(v))
{
std::cout << "building Foo..\n";
}
};
int main()
{
int v;
Foo<int> foo(v);
std::cin.ignore();
}
visual c++ 2010 输出:
错误 C2664:
'Foo<T>::Foo(T &&)':无法将参数 1 从'int'转换为'int &&'
我不能将左值绑定到右值引用是否正常?
编辑:
函数也一样:
void f(int && v)
{
}
int v;
f(v); //won't compile
我有点困惑,因为我认为 std::forward 对于检测是否使用左值或右值引用调用方法很有用。 但似乎我们无法将任何左值绑定到右值引用中......至少没有模板参数但我不太了解它
【问题讨论】:
-
是的,这很正常。仅当构造函数本身是模板时,引用折叠规则才适用。
-
如果引用折叠规则总是适用于右值引用语法而不管上下文,那么就不可能专门表示一个真正的右值引用,这不会很有用。
-
在
void f(int && v)中,v始终是一个右值引用。在template<typename U> void f(U && v)中,v由于引用折叠规则,可以是右值引用或左值引用。 -
This 可能会让你更清楚。
-
因为您传递的是左值,而不是右值。
标签: c++ c++11 visual-c++-2010 rvalue-reference