我有这段代码,它不能编译,这是预期的。
这是错误:an rvalue reference cannot be bound to an lvalue
class SomeData
{
public:
vector<int> data;
SomeData()
{
cout << "SomeData ctor" << endl;
data.push_back(1);
data.push_back(2);
data.push_back(3);
}
SomeData(const SomeData &other)
{
cout << "SomeData copy ctor" << endl;
data = other.data;
}
SomeData(SomeData &&other)
{
cout << "SomeData move ctor" << endl;
data = move(other.data);
}
~SomeData()
{
cout << "SomeData dtor" << endl;
}
void Print() const
{
for(int i : data)
cout << i;
cout << endl;
}
};
void Function(SomeData &&someData)
{
SomeData localData(someData);
localData.Print();
}
int main(int argc, char *argv[])
{
SomeData data;
Function(data); // ERROR
data.Print();
return 0;
}
但是,当我变成Function()
模板时,它可以正常工作,并使用复制构造函数SomeData
代替。
template<class T>
void Function(T &&someData)
{
T localData(someData); // no more error
localData.Print();
}
这是标准的 C++ 行为吗?
我注意到 Visual Studio 在模板方面往往更加宽容,所以我想知道我是否可以期望所有兼容的 C++11 编译器都有同样的行为。