[recovery mode] C++17 изменения вывода auto при фигурной инициализации
В GCC7 реализован последний стандарт С++17 (будет принят в этом году)
gcc.gnu.org/projects/cxx-status.html#cxx1z
gcc.gnu.org/projects/cxx-status.html#cxx1z
Хотелось бы обратить внимание, что изменились правила вывода типа auto при фигурной инициализации.
С++11, С++14 — при выводе типа использовали следующие правила:
int foo(){
return 1;
}
auto x = foo(); // x = int
auto x{foo()}; // x = initializer_list
Разница между обычной и фигурной инициализизацией была неинтуитивной и странной.
Также это выглядело неинтуитивно при инициализируюшем захвате.
Скотт Майерс обращает внимание на это в своей книге.
[x = foo()](){} // x = int
[x{foo()}](){} // x = initializer_list
Вывод типа возвращаемого значения, частично решал эту проблему.
auto f()
{
return {1,2}; // ошибка вывода типа, {1,2} не является корректным выражением
}
Но ситуация проявляется вновь, в случае отдельной переменной auto
auto f()
{
auto x{1,2}; // x = initializer_list
return x; // возвращается как initializer_list, при попытке доступа возникает неопределённое поведение
}
В С++17 для фигурной инициализации правила отныне такие:
1. При фигурной инициализации только с одним элементом, тип будет выведен из типа этого элемента.
auto x { 1 }; // x = int
2. При фигурной инициализации с несколькими элементами, вывод будет невозможным.
auto x1 = { 1, 2 }; // ошибка: невозможно наличие нескольких элементов при фигурной инициализации auto
Proof