戻り値の型を構築するための明示的なコンストラクタを使用することはできません来るので、私はこのクラスの作成:は、どのように私は明示的なコンストラクタとその動作で遊ん
#include <iostream>
class X
{
public:
explicit X(void)
{
std::cout << "Default constructor\n";
}
explicit X(X const& x)
{
std::cout << "Copy constructor\n";
}
explicit X(X&& x)
{
std::cout << "Move constructor\n";
}
};
基本的に明示的なテストするための単なるスタブですコンストラクタ。 次に、私はいくつかの状況を試してみたかったのです。だから私はこの試みた:
X foo(void)
{
X a{};
return a; // ERROR: no matching constructor found!
}
int main()
{
X w{}; // Default Constructor
X x{w}; // Copy Constructor
X y{std::move(x)}; // Move Constructor
X z{foo()};
}
をそして、あなたが見ることができるように私はfoo()
内a
を返すことができません。コピーコンストラクタで戻り値の型Foo
を初期化しようとしていますが、何らかの理由でそれを使用できません。
提供されたコピーコンストラクタを使用できないのはどうしてですか? explicit
仕様では、コピーコンストラクタから削除すると問題が発生することがわかりました。しかし、なぜ?
何でももっと私を混乱することは、私は次の操作を行うことができるということです。
void bar(const X& a) { /* */ }
bar(X{});
それは文句はありません。しかし、bar()
のパラメータをa
と同じにするべきではありません。foo()
と同じ方法で戻り値を構成しますか?
'bar'を呼び出すとコンストラクタがまったく呼び出されず、参照(ポインタ)が渡されます。コピーされていないコンストラクタが呼び出されるはずです。 –