Автоматический вывод типа `auto x = {1,2,3};`C++

Программы на C++. Форум разработчиков
Anonymous
 Автоматический вывод типа `auto x = {1,2,3};`

Сообщение Anonymous »

Традиционно люди читают объявление/определение переменной слева направо, например:

Код: Выделить всё

std::vector arr = {3.14, 1.414, 2.71, -0.2};
Итак, смысл {3.14, 1.414, 2.71, -0.2 ясен: у нас есть переменная типа std::vector arr< /code>, мы хотим инициализировать его четырьмя элементами: 3.14, 1.414, 2.71, -0.2
Но введение auto делает это немного более непонятным. Что делает следующее ключевое слово auto?:

Код: Выделить всё

auto arr = {3.14, 1.414, 2.71, -0.2};
Мой clangd намекает, что здесь arr: std::initializer_list, это уникальный результат вывода типа для всех компиляторов со стандартными жалобами или некоторые компиляторы могут это делать свободно сделать auto arr здесь std::vector?
Более подробный и сложный пример: у меня есть функция шаблона, позволяющая получить максимальное значение ровно из трех std ::векторыs:

Код: Выделить всё

template 
constexpr T getMax(const std::vector &v1, const std::vector &v2, const std::vector &v3)
{
auto arr = { std::views::all(v1), std::views::all(v2), std::views::all(v3)};
auto view = std::views::join(arr);
return std::ranges::max(view);
}
В этом фрагменте мы определили переменную автоматического определения:

Код: Выделить всё

auto arr = { std::views::all(v1), std::views::all(v2), std::views::all(v3)};
его выведенный тип из gcc: std::initializer_list, что требует компилятор, что тип auto должен был быть выведен к этому длинному конкретному типу? Является ли этот результат уникальным или каждый компилятор волен делать свои собственные выводы, если он следует некоторым правилам?

Подробнее здесь: https://stackoverflow.com/questions/790 ... to-x-1-2-3

Вернуться в «C++»