48

请注意,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:看起来肯定是一个编译器错误。它显然已在 GCC 4.7.3 中修复。

4

4 回答 4

4

GCC/libstdc++ 贡献者 Paolo Carlini确认这是一个错误/回归

于 2012-10-17T22:52:10.573 回答
-1

我找到了这个:

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

因此,base{} 创建的临时对象是通过受保护的构造函数完成的,这可能会令人窒息。

于 2012-09-21T16:47:52.003 回答
-1

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

于 2012-09-14T17:18:33.100 回答
-1

用 icpc 编译它(英特尔编译器测试版本 11.1 -> 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相同

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

于 2012-09-18T16:46:45.210 回答