Гарантирует ли 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>
это имя локальной переменной. Любое более сложное выражение не будет неявно двигаться.
И выражения более сложные, чем это, не будут подвергаться какой-либо форме исключения.