fre*_*low 16 c++ const g++ default-constructor visual-c++
这与当前的MSVC编译器完美编译:
struct Foo
{
} const foo;
Run Code Online (Sandbox Code Playgroud)
但是,它无法使用当前的g ++编译器进行编译:
error: uninitialized const 'foo' [-fpermissive]
note: 'const struct Foo' has no user-provided default constructor
Run Code Online (Sandbox Code Playgroud)
如果我自己提供默认构造函数,它可以工作:
struct Foo
{
Foo() {}
} const foo;
Run Code Online (Sandbox Code Playgroud)
这是MSVC的另一个案例是过于宽松,还是g ++过于严格?
Alo*_*ave 15
C++ 03标准:
8.5 [dcl.init]第9段
如果没有为对象指定初始化程序,并且该对象是(可能是cv限定的)非POD类类型(或其数组),则该对象应默认初始化; 如果对象是const限定类型,则底层类类型应具有用户声明的默认构造函数.
从上面看,gcc中的错误似乎是完全有效的.
[2003: 8.5/9]:
如果没有为对象指定初始化程序,并且该对象是(可能是cv限定的)非POD类类型(或其数组),则该对象应默认初始化; 如果对象是const限定类型,则底层类类型应具有用户声明的默认构造函数.否则,如果没有为非静态对象指定初始化程序,则该对象及其子对象(如果有)具有不确定的初始值; 如果对象或其任何子对象是const限定类型,则程序格式错误.
和:
[n3290: 8.5/11]:
如果没有为对象指定初始化程序,则默认初始化该对象; 如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值.[ 注意:具有静态或线程存储持续时间的对象是零初始化的,请参见3.6.2._ -end note_]
[n3290: 8.5/6]:
到默认初始化的类型的对象T
是指:
- 如果
T
是(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(如果T
没有可访问的默认构造函数,则初始化是错误的);- 如果
T
是数组类型,则每个元素都是默认初始化的;- 否则,不执行初始化.
如果程序要求对const限定类型的对象进行默认初始化
T
,T
则应为具有用户提供的默认构造函数的类类型.
所以MSVC在这里比两个标准要求更宽松.