奇怪的未初始化的const成员行为

omi*_*ron 17 c++ gcc c++11

请考虑以下代码段:

struct Foo {

};

template<typename T>
struct Bar {
    const T foo;
};

int main() {
    Bar<Foo> test;
}
Run Code Online (Sandbox Code Playgroud)

我用g ++ - 4.9.2用[-std = c ++ 11 -O0 -g3 -pedantic -Wall -Wextra -Wconversion]编译它并得到它error: uninitialized const member in ‘struct Bar<Foo>’.这很明显.

但是尝试添加std :: string作为Foo成员和程序编译!

#include <string>
struct Foo {
    std::string test;
};
// (...)
Run Code Online (Sandbox Code Playgroud)

发生了什么?将测试类型替换为double会导致程序无法再次编译.什么字符串成员在课堂上变化?

使用此代码段链接到在线编译器.

从版本4.6开始,gcc似乎就像那样.

Jen*_*ens 17

我认为应始终如一地产生错误.Clang这样做了.C++标准在第12.1.4节的第4.3节中说明默认构造函数在隐含时被删除

- 任何const-qualified类型(或其数组)的非变量非静态数据成员,没有大括号或等于初始化程序,没有用户提供的默认构造函数,

由于Foo没有用户提供的默认构造函数,Bar应该有一个隐式删除的默认构造函数,因此Bar<Foo> test在main中实例化会产生错误.

也许向GCC报告错误?