Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';t编译器警告";局部变量或临时变量的返回地址;当返回对局部变量的局部引用时?_C++_Visual Studio 2010 - Fatal编程技术网

C++ 为什么';t编译器警告";局部变量或临时变量的返回地址;当返回对局部变量的局部引用时?

C++ 为什么';t编译器警告";局部变量或临时变量的返回地址;当返回对局部变量的局部引用时?,c++,visual-studio-2010,C++,Visual Studio 2010,在VisualStudio2010中编译以下代码时会发生这种情况。我的问题是:C++编译器会警告一个函数是否返回一个局部变量的地址,但是为什么当它返回一个局部引用到一个局部变量时它不发出警告?p> 它是否仍然错误(返回局部变量的局部引用),只是编译器无法检测到它?检查'num'和'r'的地址可以发现它们共享相同的内存位置 #include <iostream> using namespace std; int & intReference() { int num =

在VisualStudio2010中编译以下代码时会发生这种情况。我的问题是:C++编译器会警告一个函数是否返回一个局部变量的地址,但是为什么当它返回一个局部引用到一个局部变量时它不发出警告?p> 它是否仍然错误(返回局部变量的局部引用),只是编译器无法检测到它?检查'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);
}
#包括
使用名称空间std;
int&intReference(){
int num=5;
int&r=num;
是的,它还是错的


编译器无法检测到您正在进行危险(或非法)操作的所有情况。它会在发现这些情况时发出警告,但无法识别所有情况(也不必如此).

正如你所知,MSVC 2015仍然没有对此发出警告。甚至在墙上也没有。我昨天刚刚被这样一个愚蠢的错误咬了一口。我同意你的看法,对于非编译器编写者来说,这似乎是一个很容易发现的错误。不管怎样,真正困扰我的是,我们不得不忍受类似这样的警告无用的“未引用的形式参数”,但像这样的灾难性错误可以免费通过。是的,这是一个可怕的例子。