В C ++ 11 у нас есть хороший равномерный синтаксис инициализации для объектов. Почему он не распространяется и на не-объектные типы?
Есть ли какая-то синтаксическая двусмысленность для этого, или это просто глупый вопрос, который я задаю?
Пример:
struct s{ int k;};
s s1{1}; //ok (object initialization)
s const& s3{3}; //ok (object initialization)
s& s2{s1}; //error (reference initialization)
Более полезный пример:
struct t{ t(t const& x) : k(x.k){} int k;};
struct c
{
c(t& x1,t& x2)
: s1_{x1} //error (reference initialization)
, s2_{x2} //ok (object initialization)
{}
t& s1_;
t s2_;
};
Другой :
template<class T>
T get()
{
return T{};
}
//ok (object initialization)
get<int>();
//error (void initialization? I do not know terminology for void() token equivalent)
get<void>();
Правила инициализации C ++ довольно сложны. Они описаны во второй половине главы (п. 8) стандарта. Существует нулевая инициализация, прямая инициализация, инициализация значения, копирование-инициализация, инициализация списка, и это лишь некоторые из них, и у каждого из них могут быть разные взаимодействия в зависимости от контекста (объявление, параметр, возврат, выброс, инициализация члена и т. Д. ), свойства связываемого типа и входное выражение инициализации или фигурный список инициализации. Разработчики языка также ставят целью быть почти обратно совместимыми с C и более старыми версиями C ++, что ограничивает их возможности. Требуется немало исследований, чтобы размышлять о последствиях изменений в правилах инициализации, и изменения могут привести к множеству непреднамеренных угловых случаев. Если вам интересно, я призываю вас изучить стандарт и попытаться разобраться в последствиях предложенного вами изменения.
Других решений пока нет …