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 и вы передаете его вперед), аргументы шаблона не изменяют поддержку семантики перемещения.

Другие вопросы по тегам