簡體   English   中英

右值引用和用戶定義的轉換

[英]rvalue references and user defined conversion

我試圖弄清楚下面的代碼中發生了什么(它的靈感來自shared_ptr(unique_ptr&&)構造函數)。

#include <iostream>
using namespace std;

class A {};

class B {
public:
    B(const A&) {
        cout << "ctor from A&\n";
    }
};

void f(B&&) { cout << "f(B&&)\n"; };
void f(const B&) { cout << "f(const B&)\n"; }

int main() {
    A a;
    f(a);
}

我試圖了解它是如何工作的。 為什么右值是轉換的結果並調用f(B&&)

function 不接受A類型的 object 。 但是,它確實接受B類型的 object ,並且A可以通過隱式轉換構造函數轉換為B 轉換的結果是prvalue。 當參數是純右值時,右值引用重載比 const 左值引用更匹配。

基本上,調用f(a)使用接受AB的構造函數創建一個臨時(右值) B object 。 然后重載決議開始確定哪個f是更好的匹配。

此處適用的重載解決規則是over.match.best#over.ics.rank-3.2.3

S1 和 S2 包括引用綁定 ([dcl.init.ref]) 並且都不引用非靜態成員 function 的隱式 object 參數,聲明時沒有引用限定符,並且 S1 將右值引用綁定到右值,S2 綁定左值參考

采用右值引用的重載優先於采用左值引用的重載。 (鏈接規則中有一個類似的例子)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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