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)
}
auto
с нами в языке давно и с C++11 оно глубоко укоренилось в языке: дать пользователю возможность вывести тип для своей переменной — так, как это происходит в шаблонах, оказалось хорошей идеей.Однако по непонятным причинам
auto
до сих пор остается искусственно ограничен в одном моменте: выводе типов массивов.Хотя, казалось бы, мы ведь можем выводить тип
std::intiializer_list
:Тип
std::array
у нас тоже отлично выводится:Кроме того, начиная с C++20 мы можем написать так, у нас прекрасно все выведется:
Чем же обычный массив их хуже? По непонятным причинам мы до сих пор не можем написать
Кажется, будто время наконец это исправить. Ибо это звучит как искуственное ограничение.
Ожидаемое поведение