はい、それは「少し直感に反する」です。コピー省略を有効にすると、コンストラクターのすべての副作用も省略されます。
#include <iostream>
struct X {
X() { std::cout << "Construct" << std::endl; }
X(X&&) { std::cout << "Move" << std::endl; }
~X() { std::cout << "Destruct" << std::endl; };
};
X f() { return X(); }
int main()
{
X x(f());
return 0;
}
コピー省略: g++ -std=c++11 src-test/main.cc
Construct
Destruct
コピー省略なし: g++ -std=c++11 -fno-elide-constructors src-test/main.cc
Construct
Move
Destruct
Move
Destruct
Destruct
コンパイラは、プログラム/ライブラリがビルドされるハードウェアを認識しており、(オプションで) コピー省略を適用できます。C++ 言語自体は、ハードウェア固有の戻りメカニズムを認識していません。したがって、このコンテキストで特定のアドレスに構築することはできません。