2015-11-14 97 views
3

刚才我有以下种类的错误:编译时初始化C++与本身是常量变量

#include <iostream> 

const int i = i; 

int main(void) 
{ 
    /* not allowed by default, but with -fpermissive */ 
    //const int i; 
    /* allowed by default, even without -fpermissive. Seems to initialize to 0 */ 
    for (int j = 0; j < i; ++j) 
     std::cout << "hi"; 
    /* i = 0 */ 
} 

g++ const-init.cpp -Wall -Wextra -pedantic -O2 

因为编译器默默初始化我到0某些回路被优化掉。错误是由于复制粘贴错误而发生的。

这个'功能'有效和/或记录在某处?它甚至有什么好处?它有名字吗?

编辑:没有-02 G ++的行为就像我希望它的行为:它使用-O2标志时,将发出以下错误

const-init.cpp:8:19: warning: ‘i’ is used uninitialized in this function [-Wuninitialized] 
    const int i = i; 
       ^

那么,为什么编译器为我以为0,甚至删除整个因为这个假设循环?

+1

可能的重复:https://stackoverflow.com/questions/28152298/why-is-initialization-of-a-new-variable-by-itself-valid –

+1

有可能比你需要更多的信息[本问答](http://stackoverflow.com/questions/23415661/has-c-standard-changed-with-respect-to-the-use-of-indeterminate-values-and-und),但TL; DR:don'不依赖于'我'的价值。变量'i'在它自己的初始化范围内,但它的值没有明确定义。 – chris

+0

你们很快,发布这个问题后,我注意到 - 墙确实发出了警告,但使用-O2时并不如此。我在问题中指定了 – mxmlnkn

回答

3

它的名字是“未定义的行为”,并且将i设置为0只是一个可能的结果。