私は以下に書かれたコードが違法であることを知っています
void doSomething(std::string *s){}
int main()
{
doSomething(&std::string("Hello World"));
return 0;
}
その理由は、一時オブジェクトのアドレスを取得することが許可されていないためです。しかし、私の質問はなぜですか?
次のコードを考えてみましょう
class empty{};
int main()
{
empty x = empty(); //most compilers would elide the temporary
return 0;
}
ここで受け入れられた答えは言及しています
「通常、コンパイラは、メモリのまったく同じ場所にある 2 つのオブジェクトとして構築された一時オブジェクトとコピーを考慮し、コピーを回避します。」
ステートメントによると、一時的なものはいくつかのメモリ位置に存在していたと結論付けることができ(したがって、そのアドレスが取得された可能性があります)、コンパイラは、一時的なものと同じ場所にインプレースオブジェクトを作成することにより、一時的なものを削除することにしました。 .
これは、テンポラリーのアドレスを取得できないという事実と矛盾しますか?
また、戻り値の最適化がどのように実装されているかも知りたいです。誰かが RVO の実装に関連するリンクまたは記事を提供できますか?