Я новичок в C++, и инициализация скобок (или унифицированная инициализация) действительно сбивает с толку. Что именно происходит, когда функция возвращает список аргументов в фигурных скобках? Большое спасибо за разъяснение.
std::vector<double> foo()
{
return {1, 2}; // is this the same as: std::vector<double>{1, 2} or std::vector<double>(1, 2)? or something else?
}
return {1, 2};
, возвращаемое значение инициализируется списком из {1, 2}
, в результате возвращаемый std::vector<double>
содержит 2 элемента со значением 1
и 2
.
return std::vector<double>{1, 2};
, возвращаемое значение инициализировано копированием из std::vector<double>{1, 2}
, в результате возвращаемое std::vector<double>
содержит 2 элемента со значением 1
и 2
. По идее, он создаст временный std::vector<double>
, а возвращаемое значение инициализируется копированием из временного; из-за обязательного исключения копирования (начиная с C++17) операция копирования/перемещения опущена, и эффект точно такой же, как и в 1-м случае.
return std::vector<double>(1, 2)
, возвращаемое значение инициализируется копированием из std::vector<double>(1, 2)
, в результате возвращаемое std::vector<double>
содержит 1 элемент со значением 2
. Обязательное удаление копии действует и в этом случае.
@lucmobz Эффект такой же из-за исключения копирования (начиная с C++ 17).
Хорошо, но если они эквивалентны, то возврат с помощью фигурных скобок избавляет от ввода имени типа?
@lucmobz Да, меньше печатать.
поэтому возврат {1, 2} эквивалентен вызову std::vector<double> временного {1, 2}? Остальные подразумевают копию?