В разделе cpprefernce: категории значений говорится, что «член выражения объекта, где a является значением r, а m является элементом не статических данных не ссылочного типа», является значением xvalue. , В стандарте (я нашел в: N4140, черновом стандарте C ++ 14 ) говорится (на странице 87), что «выражение является значением xvalue, если оно ... выражение выражения доступа члена класса, обозначающее нестатический член данных не ссылочного типа, в котором выражение объекта является значением xvalue. "
Я хотел проверить мое понимание следующего кода:
struct B { // B for Boring...
int i{0};
};
template <typename T> struct V {
V() { cout << "V" << endl; }
};
template <typename T> struct V<T &> { // Partial Specialization
V() { cout << "V&" << endl; }
};
template <typename T> struct V<T &&> { // Partial Specialization
V() { cout << "V&&" << endl; }
};
int main() {
int i{1};
V<decltype((1))> v1; // V
V<decltype((i))> v2; // V&
V<decltype((move(i)))> v3; // V&&
V<decltype((B().i))> v4; // V, why not V&&?
V<decltype((move(B()).i))> v5; // V&& as expected
}
Если мои вычисления верны, то B().i
является «членом выражения объекта, где [B()
] является значением r», и, согласно ссылке, выражение должно быть значением xvalue, а тип, возвращаемый decltype
должно быть int &&. Обратите внимание, что я использую gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
, и я попробовал это без флагов и с -std=c++14
.
(Для ясности, я также проверяю свое понимание "decltype" здесь, но стандарт, с которым я ранее ссылался, и ссылка, даются дословно и довольно четко о поведении decltype).
Извините, это был не вопрос ... Я прав? Следует ли обновить ссылку, чтобы прояснить это поведение?