5

これは、Visual Studio 2010 で次のコードをコンパイルするときに発生します。私の質問は、C++ コンパイラは、関数がローカル変数のアドレスを返す場合に警告を発しますが、ローカル変数へのローカル参照を返すときに警告を発しないのはなぜですか?

それはまだ間違っていますか (ローカル変数へのローカル参照を返す)、コンパイラがそれを検出できなかっただけですか? 「num」と「r」のアドレスを調べると、同じメモリ位置を共有していることがわかります。

#include <iostream>  
using namespace std;

int & intReference() {
  int num = 5;
  int &r = num;
  cout << "\nAddress of num: " << &num;

  //return num; // Compiler warning: C4172: returning address of local variable or temporary
  return r; // No warning?
}

void main() {
  int &k = intReference();
  cout << "\nk = " << k;  // 5
  cout << "\nAddress of k: " << &k; // same address as num

  char c;
  cin.get(c);
}
4

1 に答える 1

6

はい、まだ間違っています。

コンパイラは、危険な (または違法な) ことをしているすべてのケースを検出できるわけではありません。見つかった場合は警告しますが、すべてのケースを特定できるわけではありません (特定する必要はありません)。

于 2012-05-06T10:22:42.670 に答える