今日私は、このコードが動作すると期待しているので、このコードは機能しません。 私の知っているL値のコピーコンストラクタは、R値の場合は移動コンストラクタを選択する必要があります。そうでなければ、実際には何もしませんが、R値にキャストするstd::move
の目的は何ですか。私はreturn obj
がコピーコンストラクタを呼び出すと予想していましたが、moveを呼び出します。 コピーはここでは役に立たないと理解しますが、これはルールに関するものです。私のコピーコンストラクタが副作用を持っていて、それが私のケースです(私はそれがすべきではないことを知っていますが、技術的にはそれが可能です - 例えばstd :: cout call)。 このような動作を可能にする標準はありますか?また、どのように私はコピーを強制することができますか? cppreference(強調鉱山)からmoveコンストラクタがコピーの代わりに返されました
#include <iostream>
class X
{
public:
X() = default;
X(const X& r): i(r.i)
{
std::cout << "copy ctor" << std::endl;
}
X(const X&& r): i(r.i)
{
std::cout << "move ctor" << std::endl;
}
int i = 0;
};
X foo()
{
X obj;
obj.i = 10;
return obj;
}
int main()
{
X x = foo();
}
移動CTOR
移動CTOR
あなたが明示的に移動を要求した場合、それは暗黙のうちにコピーされてしまい、移動しないかもしれません。 – incognito
説明ありがとうございます – incognito
本当に@incognitoです。そのため、クラスを慎重に設計する必要があります。 – Quentin