В С++ 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>();
s1_(x1)
вполне достаточно. - person Sergey Kalinichenko   schedule 11.06.2013void
— неполный тип объекта; нет возможности создавать объекты типаvoid
. - person Angew is no longer proud of SO   schedule 11.06.2013s1_(x1)
и его последствия, безусловно, раздражают - они постоянно сбивают с толку новых практиков, способствуя восприятию C ++ как сложного языка. К сожалению, уже слишком поздно что-то менять в C++11: как только появится функция такого масштаба, она исчезнет навсегда. - person Sergey Kalinichenko   schedule 11.06.2013std::is_object<void>::value
ложно. Так что нет возможности создать пустоту, так же как и нельзяcreate
ссылаться. Однако C++ позволяет возвращать токен void() (и, к сожалению, не передавать в параметр!), который выглядит как конструктор, но не позволяет возвращать void{} как некоторый токен. И это то, что я спросил, какой синтаксис {} не для не-объектов - person abir   schedule 11.06.2013void
— это неполный тип, и его невозможно заполнить. - person R. Martinho Fernandes   schedule 11.06.2013s& s2 { s1 };
действительно должно быть возможно. - person jogojapan   schedule 11.06.2013invalid initialization of non-const reference of type 's&' from an rvalue of type '<brace-enclosed initializer list>'
. не знаю насчет лязга - person abir   schedule 11.06.2013int
вместо структуры). Тем не менее, в 8.5.4/3 сказано: [...] В противном случае, если список инициализаторов имеет один элемент, объект или ссылка инициализируется из этого элемента; [...] Следует признать, что предыдущее правило объясняет, что для всех ссылок создается временная ссылка, и если ссылка неконстантна, программа представляет собой некорректную попытку связать неконстантную ссылку lvalue к временному. Мне непонятно, почему они поставили правила в таком порядке. - person jogojapan   schedule 11.06.2013