Это вопрос терминологии. Если у меня есть это:
#include <vector>
void g(std::vector<int>&& arg);
void f0(std::vector<int>&& v) {
static_assert(std::is_same<decltype(v), std::vector<int>&&>::value); // Looks like v is an rvalue reference.
static_assert(std::is_same<decltype((v)), std::vector<int>&>::value);
static_assert(std::is_same<std::decay<decltype(v)>::type, std::vector<int>>::value);
return g(std::move(v)); // Fine.
}
тогда какой тип v
? Если вы говорите о вызове f0
, вы бы сказали «f0
принимает ссылку rvalue» (верно?), Но в пределах f0
, v
не является ссылкой rvalue, иначе std::move
не будет не требуется? Правильно? Но static_assert
показал, что это значение, верно?
Аналогично:
void f1(std::vector<int>&& v) {
static_assert(std::is_same<decltype(v), std::vector<int>&&>::value);
static_assert(std::is_same<decltype((v)), std::vector<int>&>::value);
static_assert(std::is_same<std::decay<decltype(v)>::type, std::vector<int>>::value);
return g(v); // Error: cannot bind rvalue reference of type 'std::vector<int>&&' to lvalue of type 'std::vector<int>'.
// So is v just a std::vector<int>?
}
Локальные ссылки на rvalue действуют так же:
void f2(std::vector<int>&& v) {
std::vector<int>&& vv = std::move(v);
static_assert(std::is_same<decltype(vv), decltype(v)>::value, "They are the same decltype. So being an argument isn't magic.");
static_assert(std::is_same<decltype(vv), std::vector<int>&&>::value);
static_assert(std::is_same<decltype((vv)), std::vector<int>&>::value);
static_assert(std::is_same<std::decay<decltype(vv)>::type, std::vector<int>>::value);
return g(vv); // Error: cannot bind rvalue reference of type 'std::vector<int>&&' to lvalue of type 'std::vector<int>'
}
Какая правильная терминология описывает тип v
? Правильно ли говорить, что f0
принимает ссылку на rvalue? Если v
является ссылкой rvalue, какова терминология, чтобы сказать, что ссылка rvalue не может использоваться для вызова функции, принимающей ссылку rvalue?