0

これはMSVCで有効なコードだと思います:

MyClass* pMc = &MyClass();

ただし、プリミティブ データ型で同じことをしようとすると、コンパイル エラーが発生します。

int* pInt = &int();

エラー:

error C2101: '&' on constant

3 つの質問があります。

  1. なぜint()私に定数を与えるのですか?
  2. そもそもエラーC2101が存在するのはなぜですか? 定数のアドレスを取得することの何が問題になっていますか?
  3. 一時オブジェクトを指す int (または他のプリミティブ) 参照を宣言する方法はありますか? (つまり、最初にローカル変数を作成せずに)

3番目の質問について:

私はこのようなことをしたくありません:

int i = int();
int* pInt = &i;

ローカル オブジェクトへの参照を使用している場合 (理由は関係ありません)、すべてのオブジェクトを 2 回宣言する必要はありません。それは退屈で面倒で、名前は本当に紛らわしいでしょう。

4

2 に答える 2

4

int()1の答えはわかりませんが(定数ではないことは確かなので、エラーは間違っていると思います)、

(2) テンポラリーのアドレスを取ることは違法です。あなたのコードはコンパイルされるべきではありませんが、非標準の MSVC++ 拡張が原因でコンパイルされます。

(3) はい、右辺値参照または const 左辺値参照を使用します。

const int& tmp = int();
int&& tmp = int(); // same as former but isn't const

参照が範囲外になるまで、一時の有効期間は延長されます。

ただし、上記の 2 つのうちの 1 つを使用する正当な理由があることを願っています。

int tmp;
于 2013-02-12T01:41:44.133 に答える
1

コード行は、標準に違反する方法で 1 つのコンパイラーでコンパイルされますが、そのポインターの逆参照は、次の行で未定義の動作になります。ので注意してください。

私はこれがうまくいくと思います:

template<typename T>
T* make_tmp_ptr(T&&t) {
   return &t;
}

次に呼び出すと、式の終わりまで続くmake_tmp_ptr(int())一時へのポインターが取得されます。int

于 2013-02-12T02:00:48.797 に答える