この式T()
は(標準による)右辺値を作成すると思います。ただし、次のコードはコンパイルされます(少なくともgcc4.0では)。
class T {};
int main()
{
T() = T();
}
メンバー関数は一時的に呼び出すことができ、上記は最初のから作成された一時的な右辺値に対してoperator =を呼び出すだけなので、技術的にはこれが可能であることを私は知っていT()
ます。
しかし、概念的には、これは右辺値に新しい値を割り当てるようなものです。これが許可される正当な理由はありますか?
編集:私がこれを奇妙だと思う理由は、組み込み型では厳密に禁止されていますが、ユーザー定義型では許可されているためです。たとえば、int(2) = int(3)
これは「割り当ての無効な左辺値」であるため、コンパイルされません。
ですから、本当の問題は、このやや一貫性のない動作が理由で言語に組み込まれたのではないかということだと思います。それとも歴史的な理由でそこにありますか?(たとえば、右辺値式でconstメンバー関数のみを呼び出すことができるようにする方が概念的には適切ですが、既存のコードが破損する可能性があるため、これを行うことはできません。)