Недавно Почему объект const требует, чтобы пользовательский конструктор по умолчанию? был отмечен дубликат Почему С++ требует созданный по умолчанию конструктор по умолчанию для построения объекта const?. Я использую coliru и rextexter, чтобы проверить различные версии gcc (g++ - 4.7, g++ - 4.8, g++ - 4.9) и clang (3.4 и 3.5), чтобы узнать, было ли это поведение введено в новых версиях компилятора. Здесь у нас есть два тестовых примера, взятых из обоих вопросов:
class A {
public:
void f() {}
};
int main()
{
A a; // OK
const A b; // ERROR
a.f();
return 0;
}
и
struct B{
B():x(42){}
int doSomeStuff() const{return x;}
int x;
};
struct A{
A(){}//other than "because the standard says so", why is this line required?
B b;//not required for this example, just to illustrate
//how this situation isn't totally useless
};
int main(){
const A a;
}
ошибки clang:
error: default initialization of an object of const type 'const A' requires a user-provided default constructor
A const a;
^
ожидается, но не gcc, и MSVC также не работает. Я думал, что, возможно, я схожу с ума, потому что в стандартных цитатах ясно сказано:
§ 8.5
6 Для инициализации объекта типа T по умолчанию:
- если T является (возможно, cv-квалифицированным) классом типа (раздел 9), конструктор по умолчанию для T называется (и инициализация плохо сформирована, если T не имеет доступный конструктор по умолчанию);
[...]
Если программа вызывает инициализация по умолчанию объекта типа const, T, T должен быть типом класса с предоставленным пользователем конструктором по умолчанию.
11 Если для объекта не задан инициализатор, объект по умолчанию инициализируется; [...]
Язык, не содержащий POD, присутствующий во втором вопросе, кажется, отсутствует в n3337, поэтому, возможно, мне не хватает чего-то, что могло измениться. Это ошибка, дубликат или я что-то упускаю?