请考虑以下代码段:
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报告错误?