C++11 кортеж с копией elision или переместить семантику
Я написал функцию, как показано ниже:
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))?
1 ответ
AFAIK копия Elision всегда не является обязательным. Стандарт просто прямо говорит, что компилятору разрешено проводить такую оптимизацию, потому что он меняет наблюдаемое поведение, он не предписывает его. Конкретно 12,8 р. 31:
При соблюдении определенных критериев реализация может опустить конструкцию копирования / перемещения объекта класса, даже если конструктор, выбранный для операции копирования / перемещения и / или деструктор для объекта, имеет побочные эффекты.
Отказ от ответственности: это из проекта сообщества n3690, но версия для C++11 имеет аналогичное утверждение, если не совсем то же самое.
Кстати, критерии указаны тут же.
Для переезда, однако, это гарантировано. Вы делаете временный объект и возвращаете его (т.е. std::make_tuple
возвращает rvalue
и вы передаете его вперед), аргументы шаблона не изменяют поддержку семантики перемещения.