[英]Why is f(x).swap(v) okay but v.swap(f(x)) is not?
我們有:
vector<int> f(int);
vector<int> v;
這有效:
f(x).swap(v);
這不是:
v.swap(f(x));
為什么?
swap()
對vector<int>
采用非const引用。 非const引用不能綁定到rvalue(臨時對象)。 對按函數返回的函數(如f
)的調用是一個右值。
f(x).swap(v)
工作的原因是因為在std::vector<int>::swap
, f(x)
返回的臨時對象可以使用this
來引用它自己。 this
不是一個左值。
您可以在臨時對象上調用成員函數,但在C ++中,它們不能綁定到非const引用。
例如:
int &x = 5; // illegal because temporary int(5) cannot be bound to non-const reference x
實際上,(雖然詹姆斯的答案肯定是正確的( 普拉松的 答案也是如此),但還有一些潛在的問題需要掌握。
當我們將f(x)
減少到其結果y
和y.swap(v)
(或v.swap(y)
,在這種情況下無關緊要)使用廣義標識符名稱時,它變為
y.func(v)
現在, func()
是一個帶有一個參數的成員函數,它實際上有兩個參數 :作為v
傳遞的是什么,以及每個非靜態成員函數接收的隱式this
指針 ,這里綁定到y
。 拋棄封裝,可以將稱為y.func(v)
每個成員函數作為非成員函數調用為func(y,v)
。 (事實上,實際上有一個非成員的swap()
函數。而且,每次你需要重載那些可能作為成員或非成員重載的二元運算符之一時,你必須做出這個決定。)
但是, y.func(v)
和func(y,v)
之間存在細微的差別,因為C ++會處理this
參數,即通過在它之前寫入它來傳遞的參數.
(點),與其他論點不同,它在很多方面都這樣做。
正如您所發現的,即使對於非const
成員函數, this
參數也可能是rvalue(臨時),而對於其他參數, 非const引用會阻止 rvalues綁定到參數。 此外, this
參數的運行時類型可能會影響調用哪個函數 (對於virtual
成員),而其他參數的運行時類型則無關緊要,因為僅根據編譯時類型選擇函數。 隱式轉換只會應用於成員函數的顯式參數,但永遠不會應用於其隱含的this
參數。 (這就是為什么你可以傳遞const std::string&
的字符串文字,但不能在字符串文字上調用std::string::size()
。)
所以,總結一下,盡管之前是什么.
最終作為(隱式)函數參數,它實際上與其他函數參數的處理方式截然不同 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.