【发布时间】:2012-09-01 01:16:37
【问题描述】:
注意派生使用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 中修复。
【问题讨论】:
-
与大括号初始化器有关的编译器错误在 GCC 中并不少见。
-
@Als 当然...因为 gcc-4.3.4 没有初始化列表。
-
@DrTwox 我只是想知道 g++4.7.x 是否将此表达式
derived() : base {} {}解释为derived() : base(base{}) {}。要创建临时文件,需要公开访问base::base()。我没有 g++4.7.x,所以如果将临时更改为我的提案 - 那么如果这是错误就很清楚了。 -
@PiotrNycz:关于
:base(base{})理论,我用-fno-elide-constructors编译了代码,没有额外调用复制构造函数或析构函数。所以这里暂时不涉及。 -
@cuabanana - 据我所知,它是有效的 C++11 语法。
标签: c++ gcc c++11 g++ uniform-initialization