私はHereを記述して、左辺値と右辺値の概念を学んでいます。rvalueのアドレスは許可されていますか?
しかし、自分の例を次のように考案すると、VS2017を使ってコンパイルしても何のエラーもなく実行されます。私は、ケース1の場合は、
produceA(10).operator=(A())
と同じであることを知りました。しかし、私はまだケース2と3が許される理由を理解していません。事実、ケース2はこの記事で与えられた例と矛盾する。私は実際にこれらの2つのケースで右値のアドレスを取得していますか?彼らは未定義の行動につながるか?
#include <string>
class A
{
int data = 1;
public:
A() = default;
A(int in)
: data(in)
{}
A& operator=(const A& rhs)
{
data = rhs.data;
return *this;
}
};
A produceA(int i)
{
A a(i);
return a;
}
int main()
{
// case 1
produceA(10) = A();
// case 2
A* pa = &produceA(10); // rvalue?
// case 3
std::string* pstr = &std::string("Temp"); // rvalue?
return 0;
}
あなたのサンプルコードはコンパイルされません(http://coliru.stacked-crooked.com/a/a5adcbe34052d925)。どのコンパイラを使用していますか? – Quentin
私はVS2013とVS2017の両方でこれを試しました。どちらもエラーは発生しません。 –
ありがとうございました。ヒントの後に[この1つ](https://stackoverflow.com/questions/16380966/non-const-reference-bound-to-temporary-visual-studio-bug)も見つかります。コマンドオプション/ Zaを使用すると、ケース2と3のエラーが発生します。この拡張の背後にある目的は私にとってとても不思議そうです。 :/ –