Гарантирует ли C++11, что локальная переменная в операторе возврата будет перемещена, а не скопирована?

#include <vector>

using namespace std;

struct A
{
    A(const vector<int>&) {}
    A(vector<int>&&) {}
};

A f()
{
    vector<int> coll;
    return A{ coll }; // Which constructor of A will be called as per C++11?
}

int main()
{
    f();
}

Является coll xvalue в return A{ coll }; ?

Гарантирует ли C++11 A(vector<int>&&) будет называться, когда f возвращается?

1 ответ

Решение

C++11 не позволяет coll быть перемещенным из. Это позволяет только неявные ходы в return заявления, когда вы делаете return <identifier>, где <identifier> это имя локальной переменной. Любое более сложное выражение не будет неявно двигаться.

И выражения более сложные, чем это, не будут подвергаться какой-либо форме исключения.

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