[英]Why rvalue reference pass as lvalue reference?
pass()
引用參數並將其傳遞給reference
,但是右值參數實際上稱為reference(int&)
而不是reference(int &&)
,這是我的代碼片段:
#include <iostream>
#include <utility>
void reference(int& v) {
std::cout << "lvalue" << std::endl;
}
void reference(int&& v) {
std::cout << "rvalue" << std::endl;
}
template <typename T>
void pass(T&& v) {
reference(v);
}
int main() {
std::cout << "rvalue pass:";
pass(1);
std::cout << "lvalue pass:";
int p = 1;
pass(p);
return 0;
}
輸出是:
rvalue pass:lvalue
lvalue pass:lvalue
對於p
,根據引用折疊規則很容易理解,但是為什么模板函數將v
作為左值傳遞給reference()
呢?
為什么模板函數將
v
作為左值傳遞給reference()
?
那是因為v
是一個左值。 等等,什么? v
是一個右值引用。 重要的是它是一個引用,因此是一個左值。 它只綁定到右值並不重要。
如果要保留價值類別,則必須進行完美轉發。 完美轉發意味着如果你傳遞一個右值(就像你的情況一樣),函數將被一個右值(而不是一個左值)調用:
template <typename T>
void pass(T&& v) {
reference(std::forward<T>(v)); //forward 'v' to 'reference'
}
template <typename T>
void pass(T&& v) {
reference(v);
}
您在這里使用 Forwarding 引用非常好,但事實上現在有一個名稱v
,它被認為是右值引用的lvalue
值。
簡而言之,任何有名字的東西都是lvalue
。 這就是需要完美轉發的原因,要獲得完整的語義,請使用std::forward
template <typename T>
void pass(T&& v) {
reference(std::forward<T>(v));
}
std::forward<T>
所做的只是做這樣的事情
template <typename T>
void pass(T&& v) {
reference(static_cast<T&&>(v));
}
看到這個;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.