我正在重构一个出现在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编译器不应该发出警告吗?
我不是假装这是一个未定义的行为。我说默认情况下,从变量到自身的赋值可能是程序员的错误。除非有人使用赋值运算符有一个奇怪的方案。
答案 0 :(得分:0)
类似的问题(i=i++
)确实是未定义的行为,但主要是因为该指令包含对同一变量的两个赋值:
i
(i++
)的递增,在指令i++
后的处返回i
< / p>
分配i
问题是我们无法真正知道i
的赋值是在增量之前还是之后发生,因此未定义的行为。
在您的示例foo=foo
中,我们有一个读取,然后是写入。毫无疑问,我们必须在写入之前阅读该值,因此很容易定义。
附注是,如果operator=
被重新定义,那么foo=foo
可以做很多不仅仅是foo副本的东西。 C ++有目的地允许您以多种不同的方式在食物中拍摄自己。但无论如何,C ++编译器并不是警告/错误中主动性的黄金标准。