次のコードで、gcc と clang の両方が A クラスのコピー コンストラクターを 1 回も呼び出さないのはなぜですか (デストラクタが 1 回だけ呼び出されるため、作成されるオブジェクトは 1 つだけです)。
class A
{
public:
explicit A()
{
std::cout << "A()" << std::endl;
}
A(const A& toCp)
{
std::cout << "A(const A&)" << std::endl;
}
~A()
{
std::cout << "~A()" << std::endl;
}
A& operator=(const A& toCp)
{
std::cout << "A::operator=" << std::endl;
}
};
A fun()
{
A x;
std::cout << "fun" << std::endl;
return x;
}
int main()
{
A u = fun();
return 0;
}
このコードの出力は次のとおりです。
A()
fun
~A()
コピーコンストラクターは2回呼び出す必要があると思いました(1回は値を返すため、もう1回は行で)A u = fun(7);
このコードには -O0 を指定して gcc と clang を使用しました。
何か案は?