cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
91 stars 0 forks source link

auto[] #598

Open eoan-ermine opened 4 months ago

eoan-ermine commented 4 months ago

auto с нами в языке давно и с C++11 оно глубоко укоренилось в языке: дать пользователю возможность вывести тип для своей переменной — так, как это происходит в шаблонах, оказалось хорошей идеей.

Однако по непонятным причинам auto до сих пор остается искусственно ограничен в одном моменте: выводе типов массивов.

Хотя, казалось бы, мы ведь можем выводить тип std::intiializer_list:

#include <initializer_list>

int main() {
   auto x = { 1, 2, 3, 4, 5 };
}

Тип std::array у нас тоже отлично выводится:

#include <array>

int main() {
   std::array x = { 1, 2, 3, 4, 5 };
}

Кроме того, начиная с C++20 мы можем написать так, у нас прекрасно все выведется:

void f(auto(x)[]) { }
int main() {
   int x[] {1, 2, 3, 4, 5 };
   f(x);
}

Чем же обычный массив их хуже? По непонятным причинам мы до сих пор не можем написать

int main() {
   auto x[] { 1, 2, 3, 4, 5 }; // Compilation Error
}

Кажется, будто время наконец это исправить. Ибо это звучит как искуственное ограничение.

Ожидаемое поведение


#include <initializer_list>

int main() {
   auto x0[] = {1, 2, 3, 4, 5}; // x: int[5]
   auto x1[5] = {1, 2, 3, 4, 5}; // x: int[5]
   auto x3[] = {1, 2, 3, 4, 5.0}; // CE
   auto x4 = {1, 2, 3, 4, 5}; // x: std::initializer_list<int>
   auto x5 { 1, 2, 3, 4, 5 }; // CE (same as now)
}
eoan-ermine commented 4 months ago

Обсуждение в https://lists.isocpp.org/std-proposals/2024/07/10466.php