Документация Clang четко объясняет, что
Если класс или структура не имеет пользовательского конструктора по умолчанию, С++ не позволяет вам по умолчанию построить экземпляр const, как это ([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
}
поэтому обоснование для user- предоставления конструктора по умолчанию кажется мне лишним. И действительно, g++ 4.8.1 скомпилирует его без проблем (Online Example), хотя Clang <= 3.2 не делает.
Вопросы: почему комбинация полных inital-инициализаторов + объявленный пользователем конструктор по умолчанию недостаточно, чтобы по умолчанию построить объект const? Есть ли исправление для С++ 14 Standard?
UPDATE: может ли кто-нибудь попробовать Clang 3.3/3.4 посмотреть, исправлено ли это по сравнению с Clang 3.2?