この線
Foo f( std::move(v) );
GCC、Clang、Intel で合法です。ただし、Visual Studioは不平を言い、譲歩します
error C2664: 'Foo::Foo(const Foo &)' : cannot convert parameter 2 from 'char [100]' to 'char (&&)[100]'
1> You cannot bind an lvalue to an rvalue reference
これは私にはバグのようです。確かにv
、左辺値ですがstd::move
、右辺値参照にキャストします。
char の配列は移動できないため、正当ではありますが、右辺値参照で配列を取得する用途はあまりありません。本当にコードをコンパイルしたい場合は、回避策としてf
、通常の (左辺値) 参照を取得std::move
し、呼び出しサイトで を削除します。または、さらに良いことに、 (はテンプレートである必要はありません)f
へのポインターを取得します。この場合、呼び出しは のアドレス(つまり の最初の要素) を に渡します。これは、コンパイラによって暗黙的に実行される、いわゆる配列からポインタへの変換です。char*
f
f(v)
v[0]
v
f
ただし、他の人が指摘したように、行
data = std::move(var);
var = 0;
すべてのコンパイラで違法です。data
およびvar
は配列 (または配列への参照) であり、配列は代入できません。たとえば、var = 0;
各コンパイラで発生するエラーは次のとおりです。
GCC:
error: incompatible types in assignment of 'int' to 'char [100]'
クラン:
error: array type 'char [100]' is not assignable
インテル:
error: expression must be a modifiable lvalue
ビジュアルスタジオ:
error C2440: '=' : cannot convert from 'int' to 'char [100]'