В документации Clang четко объясняется, что
Если класс или структура не имеют определяемого пользователем конструктора по умолчанию, C ++ не позволяет вам создавать по умолчанию его константный экземпляр, как это ([dcl.init], p9)
Причина в том, что если объект const не инициализирован правильно, он не может быть изменен позже. В следующем коде есть только конструктор по умолчанию, объявленный пользователем для Test
, но все его члены имеют инициализаторы класса,
#include<iostream>
class Test
{
public:
Test() = default;
void print() const { std::cout << i << "\n"; }
private:
int i = 42; // will propagate to the default constructor!
};
int main()
{
Test const t; // <-- Clang chokes on the const keyword, g++ does not
t.print(); // prints 42
}
так что обоснование того, что пользователь также предоставляет конструктор по умолчанию, кажется мне излишним. И действительно, g ++ 4.8.1 компилирует его без проблем (сильный пример в Интернете) > Clang ‹= 3.2 - нет.
Вопросы: почему комбинации полных инициализаторов класса + объявленного пользователем конструктора по умолчанию недостаточно для создания по умолчанию константного объекта? Есть ли исправление для стандарта C ++ 14?
ОБНОВЛЕНИЕ: может ли кто-нибудь попробовать Clang 3.3 / 3.4, чтобы узнать, исправлено ли это по сравнению с Clang 3.2?