为什么当返回一个指向本地变量或临时变量的局部引用时,编译器没有警告“返回本地变量或临时变量的地址”?

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);
}

可能是重复的问题:这些本地函数返回地址之间有什么区别? - Bo Persson
只是让你知道,MSVC 2015仍然不会警告这个问题。即使在-Wall上也没有。我昨天刚被这样一个愚蠢的错误咬了一口。我同意你的看法,对于非编译器编写者来说,似乎很容易检测到这种错误。无论如何,真正困扰我的是,我们必须忍受像“未引用形式参数”这样几乎毫无用处的警告,但是像这样的灾难性错误却可以免费通过。 - user1593842
1个回答

6

是的,它仍然是错误的。

编译器无法检测您进行危险(或非法)操作的所有情况。它在发现时会发出警告,但它无法识别所有情况(也没有必要)。


4
好的,那是一个糟糕的例子。 - Mat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接