为什么这个使用统一初始化的代码片段用g ++ 4.6而不是g ++ 4.7编译?

时间:2012-09-07 07:01:52

标签: c++ gcc c++11 g++ uniform-initialization

请注意 derived 使用C ++ 11统一初始化语法来调用基类构造函数。

class base
{
    protected:
        base()
        {}
};

class derived : public base
{
    public:
        derived()
            : base{} // <-- Note the c++11 curly brace syntax
                     // using uniform initialization. Change the
                     // braces to () and it works.
        {}
};

int main()
{
    derived d1;

    return 0;
}

g ++ 4.6编译它,但是g ++ 4.7没有:

$ g++-4.7 -std=c++11 -Wall -Wextra -pedantic curly.cpp -o curly
curly.cpp: In constructor ‘derived::derived()’:
curly.cpp:4:13: error: ‘base::base()’ is protected
curly.cpp:19:24: error: within this context

发生了什么事?

更新1:它还会在没有警告的情况下编译clang ++ - 3.1
更新2:Looks like a compiler bug for sure.它显然已在GCC 4.7.3中修复。

4 个答案:

答案 0 :(得分:4)

Paolo Carlini,GCC / libstdc ++撰稿人,confirmed it is a bug/regression

答案 1 :(得分:-1)

可能是因为在版本4.7 C11中添加了显式覆盖控制。

答案 2 :(得分:-1)

使用icpc(使用版本11.1测试的intel编译器 - > 12.1)进行编译,得出:

-bash-3.2$ icpc -std=c++0x test.c 
test.c(15): error: expected a declaration
          {}
          ^

test.c(12): error: expected a "("
              : base{} // <-- Note the c++11 curly brace syntax
                    ^

compilation aborted for test.c (code 2)

编辑:但是再一次,c ++ 11在icpc中还没有完全实现 http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler/

与g ++相同 http://gcc.gnu.org/gcc-4.7/cxx0x_status.html

这清楚地表明它仍然是实验性的,所以很可能是一个错误。

答案 3 :(得分:-1)

我发现了这个:

“草案说初始化引用的初始化列表不是通过直接绑定完成的,而是通过首先在初始化列表中构造临时元素,然后将目标引用绑定到该临时”

因此,基础{}创建的临时文件是通过受保护的构造函数完成的,这可能会让人感到窒息。