Wak*_*zil 9 c++ default-constructor language-lawyer c++11
从C++ 11标准§8.5p6我们得到:
如果程序要求对const限定类型T的对象进行默认初始化,则T应为具有用户提供的默认构造函数的类类型.
下面的代码应该不会编译.但它确实在Coliru和Ideone都有.
class A{};
int main() {
const A a;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
在尝试理解这里发生了什么时,我最终得到了以下代码,它编译(至少它符合标准,与A用户提供的构造函数一样).但后来出现了以下问题:哪个标准子句确保a.b.j用0初始化(参见Ideone中的代码),下面是什么?
#include <iostream>
struct B { int j; B(){ std::cout << "B()" << '\n'; } };
struct A
{
struct B b;
int i;
public:
A(): i(1) { std::cout << "A()" << '\n'; }
};
int main() {
const A a;
std::cout << a.b.j << '\n';
std::cout << a.i << '\n';
}
Run Code Online (Sandbox Code Playgroud)
EDIT1:
很抱歉上面的编辑,但我还没有使用Unix.上周,DietmarKühl提醒我注意这样一个事实:"大多数UNIX都是从零初始化页面开始的".因此,正如我想的那样,abj不是因为初始化而不是0.事实上,我刚刚用VS2010编译了代码,abj的结果是一个整数值,正如预期的那样.因此,编辑中的问题应该被忽略.
但我很想知道clang ++或g ++是否也会为第二个片段显示错误.谢谢.
考虑到第 7.1.6.1 节第 #2 段中的注释,cv 限定符中写道:
\n\n\n\n\n2 [ 注意:声明变量 const 会影响其链接 (7.1.1)\n 及其在常量表达式中的可用性 (5.19)。如 8.5 中所述,const 限定类型的对象或子对象的定义必须指定初始值设定项或接受默认初始化。\xe2\x80\x94end\n 注意]
\n
看来编译器的行为确实很奇怪。
\n\n不过,如果您要添加数据成员,代码将不会在 ideone 中编译,但至少会在 MS VC++ 2010 中编译。\n在您提供的引用中,没有提到任何有关数据成员的内容。
\n