簡體   English   中英

為什么右值引用作為左值引用傳遞?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM