Подтвердить что ты не робот

Является ли элемент данных временного объекта значением xvalue в С++ 11?

#include <vector>

using namespace std;

struct A
{
    vector<int> coll;
};

void f(const vector<int>&){}
void f(vector<int>&&){}

int main()
{
    f(A().coll); // Is "A().coll" an xvalue? 
}

Предоставляет ли С++ 11 f(A().coll) вызов void f(vector<int>&&)?

4b9b3361

Ответ 1

Да. С++ 14, §5.2.5/4.2, с учетом E1.E2:

Если E2 - нестатический член данных, а тип E1 - это "cq1 vq1 X", а тип E2 - "cq2 vq2 T", выражение обозначает именованный член объект, обозначенный первым выражением. Если E1 - значение l, то E1.E2 - значение l; иначе E1.E2 - это значение x.

Педантично, первоначально С++ 11 классифицировал это как prvalue, но такая классификация была бессмысленной, поэтому она была изменена. Если изменение было применено в отчете о дефектах, то, однако, это ретроактивно - опубликованный стандартный документ С++ 11 N3290 неверен, а документ С++ 14 определяет С++ 11. Вероятно, это так, поскольку в противном случае компиляторы должны были бы выполнить тонкую разницу в поведении между -std=c++11 и -std=c++14. Сейчас я ленив искать DRs.