[英]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)
使用接受A
的B
的構造函數創建一個臨時(右值) 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.