constオブジェクトでstd :: moveを呼び出すと、別のオブジェクトに渡されたときにコピーコンストラクターが呼び出されるのはなぜですか?

wyer33

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 constT const&&、であり、T&&パラメーターにバインドできません次に最適なのはコピーコンストラクターです。これは削除されるため、エラーが発生します。

delete関数を明示的に指定しても、オーバーロード解決に使用できないという意味ではありませんが、オーバーロード解決によって選択された最も実行可能な候補である場合は、コンパイラエラーです。

移動構造はソースオブジェクトからリソースを盗み、それを変更する操作であるため、結果は理にかなっています。したがって、をconst呼び出すだけでオブジェクトに対してそれを行うことはできませんstd::move

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ