Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 | страница 24
>std::initializer_list
там, где вы намеревались объявить нечто иное. Эта ловушка является одной из причин, по которым некоторые разработчики используют фигурные скобки в инициализаторах только тогда, когда обязаны это делать. (Когда именно вы обязаны так поступать, мы рассмотрим в разделе 3.1.)Что касается С++ 11, то на этом история заканчивается, но для С++14 это еще не конец. С++14 допускает применение >auto
для указания того, что возвращаемый тип функции должен быть выведен (см. раздел 1.3), а кроме того, лямбда-выражения С++ 14 могут использовать >auto
в объявлениях параметров. Однако такое применение >auto
использует вывод типа шаблона, а не вывод типа >auto
. Таким образом, функция с возвращаемым типом >auto
, которая возвращает инициализатор в фигурных скобках, компилироваться не будет:
>auto createInitList() {
> return { 1, 2, 3 }; // Ошибка: невозможно вывести
>} // тип для { 1, 2, 3 }
То же самое справедливо и тогда, когда >auto
используется в спецификации типа параметра в лямбда-выражении С++14:
>std::vector
>auto resetV =
> [&v](const auto& newValue) { v = newValue; }; // C++14
>resetV({ 1, 2, 3 }); // Ошибка: невозможно вывести
> // тип для { 1, 2, 3 }
• Вывод типа >auto
обычно такой же, как и вывод типа шаблона, но вывод типа >auto
, в отличие от вывода типа шаблона, предполагает, что инициализатор в фигурных скобках представляет >std::initializer_list
.
• >auto
в возвращаемом типе функции или параметре лямбда-выражения влечет применение вывода типа шаблона, а не вывода типа >auto
.
1.3. Знакомство с >decltype
>decltype
— создание странное. Для данного имени или выражения >decltype
сообщает вам тип этого имени или выражения. Обычно то, что сообщает >decltype
, — это именно то, что вы предсказываете. Однако иногда он дает результаты, которые заставляют вас чесать в затылке и обращаться к справочникам или сайтам.
Мы начнем с типичных случаев, в которых нет никаких подводных камней. В отличие от того, что происходит в процессе вывода типов для шаблонов и >auto
(см. разделы 1.1 и 1.2), >decltype
обычно попугайничает, возвращая точный тип имени или выражения, которое вы передаете ему: