私はコンパイルしないこのコードを持っていますが、これは期待されています。
これはエラーです: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 コンパイラでこれと同じ動作を期待できるかどうか疑問に思っています。