C++ 为什么这个使用统一初始化的代码段要用g++;4.6但不是g++;4.7?
注意,派生类使用C++11统一初始化语法来调用基类构造函数C++ 为什么这个使用统一初始化的代码段要用g++;4.6但不是g++;4.7?,c++,gcc,c++11,g++,uniform-initialization,C++,Gcc,C++11,G++,Uniform Initialization,注意,派生类使用C++11统一初始化语法来调用基类构造函数 class base { protected: base() {} }; class derived : public base { public: derived() : base{} // <-- Note the c++11 curly brace syntax // using uniform
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;
}
发生什么事了
更新1:它还使用clang++-3.1编译,没有警告
更新2:它在GCC 4.7.3中显然是固定的。这可能是因为在4.7版中添加了C11显式覆盖控制。使用icpc编译此文件(使用11.1->12.1版测试的英特尔编译器)提供:
-bash-3.2$icpc-std=c++0x test.c
test.c(15):错误:应为声明
{}
^
test.c(12):错误:应为“(”
:base{}/我找到了这个:
草案说初始化列表初始化引用不是通过直接绑定完成的,而是通过首先在初始化列表中的元素外构造一个临时元素,然后将目标引用绑定到该临时元素
因此,它可能会因为base{}创建的临时正在通过受保护的构造函数完成。Paolo Carlini,GCC/libstdc++贡献者。与括号初始值设定项有关的编译器错误在GCC中并不少见。@Als当然……因为GCC-4.3.4没有初始值设定项列表。@DrTwox我只是想知道g++4.7.x是否解释了这个表达式derived():base{}
asderived():base(base{}{}
。要创建临时文件,它需要公共访问base::base()
。我没有g++4.7.x,因此如果将临时文件更改为我的提案,那么就可以清楚这是否是错误。@PiotrNycz:About the:base(base{})
理论上,我用-fno elide构造函数编译了代码,没有额外的复制构造函数或析构函数调用。因此这里没有临时的内容。@cuabanana-据我所知,这是有效的C++11语法。你能详细说明一下吗?你是指C++11,而不是C11吗?显式重写控制为什么以及如何干扰使用统一初始化时调用基类的构造函数?统一初始化对基类型完全有效。base
是一个…基。它不是引用。这与此无关。
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;
}
-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)