未初始化的常量

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中的错误似乎是完全有效的.

  • 先生我是一个哈希表 - 标准表:-) (8认同)
  • 注意:如果您想解释为什么结构体的 C 风格隐式零初始化方式在 C++ 中不起作用,那是因为 C 和 C++ 实现的 const 不同,C++ 在 C 之前有 `const`。有关更多信息,请参阅 [此聊天记录](https://chat.stackoverflow.com/rooms/116940/conversation/uninitialized-consts2)。 (2认同)

Lig*_*ica 5

[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在这里比两个标准要求更宽松.