为什么Visual Studio在自我赋值时不会发出警告(int foo = foo;)

时间:2013-11-21 09:14:40

标签: c++ visual-studio-2010 debugging warnings

我正在重构一个出现在bazilion时代的术语,偶然我产生了如下代码中的情况:

#include "stdafx.h"
#include <iostream>

int foo = foo;

//By replacing with the following instruction we causes a compile error
//int foo(foo);

int _tmain(int argc, _TCHAR* argv[])
{
    int bar = bar;
    std::cout << "Well this is awkward " << foo << std::endl;
    return 0;
}

使用不同的调试和发布配置,编译器对int foo = foo;保持沉默。

我没有看到这种说法不是等待发生的错误的情况。 Visual Studio编译器不应该发出警告吗?

我不是假装这是一个未定义的行为。我说默认情况下,从变量到自身的赋值可能是程序员的错误。除非有人使用赋值运算符有一个奇怪的方案。

1 个答案:

答案 0 :(得分:0)

类似的问题(i=i++)确实是未定义的行为,但主要是因为该指令包含对同一变量的两个赋值:

  • ii++)的递增,在指令i++后的处返回i < / p>

  • 分配i

问题是我们无法真正知道i的赋值是在增量之前还是之后发生,因此未定义的行为。

在您的示例foo=foo中,我们有一个读取,然后是写入。毫无疑问,我们必须在写入之前阅读该值,因此很容易定义。

附注是,如果operator=被重新定义,那么foo=foo可以做很多不仅仅是foo副本的东西。 C ++有目的地允许您以多种不同的方式在食物中拍摄自己。但无论如何,C ++编译器并不是警告/错误中主动性的黄金标准。