Я написал функцию, как показано ниже:C++ 11 Кортеж с копией элизии или переместить семантический
template <typename T>
std::tuple<std::vector<T>, T, T> f() {
std::vector<T> p(1000);
return std::make_tuple(std::move(p), 10, 10);
}
Поскольку тип возвращаемого является довольно сложным, это гарантировано, что в C++ 11 компилятор либо применить скопировать elision или переместить семантику, когда она конструирует результат, или я должен явно сказать что-то вроде std :: move (std :: make_tuple (std :: move (p), 10, 10))?
Не уверен, поэтому это не ответ: копия elision гарантируется при использовании именованных переменных. Вместо этого используйте ссылки rvalue, такие как: std :: make_tuple (std :: vector (1000), 10, 10); поэтому удаление переменной. Компилятор выполнит копирование. При использовании переменных это не гарантируется, а оптимизация, поэтому зависит от компилятора. –
LoPiTaL
@LoPiTaL При выполнении 'return std :: make_tuple (...)' возвращаемое значение перемещается из временного. В 'auto x = f();', 'x' перемещается из возвращаемого значения. Копирование elision позволяет компилятору опустить один из этих * ходов *. Ни в коем случае не будет скопирован «вектор», независимо от оптимизации. –
Как вы думаете, std :: move (p) избыточен? Я пробовал что-то вроде auto x = std :: make_tuple (std :: move (p), 10, 10), и я обнаружил, что он делает копию p (путем проверки размера p). –