C++17 зміни висновку auto при фігурної ініціалізації

GCC7 реалізований останній стандарт С++17 (буде прийнятий в цьому році)
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<int>


Різниця між звичайною і фігурної инициализизацией була неинтуитивной і дивною.
Також це виглядало неинтуитивно при инициализируюшем захопленні.
Скотт Майерс звертає увагу на це в своїй книзі.

[x = foo()](){} // x = int
[x{foo()}](){} // x = initializer_list<int>


Висновок типу значення, що повертається, частково вирішував цю проблему.

auto f()
{
return {1,2}; // помилка виводу типу, {1,2} не є коректним виразом
}


Але ситуація проявляється знову, у випадку окремої змінної auto

auto f()
{
auto x{1,2}; // x = initializer_list<int>
return x; // повертається як initializer_list, при спробі доступу виникає невизначений поведінка
}


В С++17 для фігурної ініціалізації правила відтепер такі:

1. При фігурної ініціалізації тільки з одним елементом, тип буде виведений з типу цього елемента.
auto x { 1 }; // x = int


2. При фігурної ініціалізації з кількома елементами, висновок буде неможливим.
auto x1 = { 1, 2 }; // помилка: неможливо наявність кількох елементів фігурного ініціалізації auto


Proof
Джерело: Хабрахабр
  • avatar
  • 0

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.