const
オブジェクトでstd :: moveを呼び出すと、別のオブジェクトに渡されたときにコピーコンストラクターが呼び出されるのはなぜですか?具体的には、コード
#include <iostream>
struct Foo {
Foo() = default;
Foo(Foo && x) { std::cout << "Move" << std::endl; }
Foo(Foo const & x) = delete;
};
int main() {
Foo const x; Foo y(std::move(x));
}
次のメッセージでコンパイルに失敗します:
g++ -std=c++14 test07.cpp -o test07
test07.cpp: In function 'int main()':
test07.cpp:10:36: error: use of deleted function 'Foo::Foo(const Foo&)'
Foo const x; Foo y(std::move(x));
^
test07.cpp:6:5: note: declared here
Foo(Foo const & x) = delete;
^
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 1
確かに、const
値を移動できないため、失敗すると思います。同時に、コピーコンストラクターを呼び出そうとする前にコードがたどるルートがわかりません。つまり、それがstd::move
要素をx値に変換することは知っていますが、その後、const
。に関してどのように進行するかはわかりません。
引数を使用std::move
して呼び出した結果のタイプT const
はT const&&
、であり、T&&
パラメーターにバインドできません。次に最適なのはコピーコンストラクターです。これは削除されるため、エラーが発生します。
delete
関数を明示的に指定しても、オーバーロード解決に使用できないという意味ではありませんが、オーバーロード解決によって選択された最も実行可能な候補である場合は、コンパイラエラーです。
移動構造はソースオブジェクトからリソースを盗み、それを変更する操作であるため、結果は理にかなっています。したがって、をconst
呼び出すだけではオブジェクトに対してそれを行うことはできませんstd::move
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加