[英]How does const modifier for member functions affect overload resolution?
我有以下測試代碼:
#include <string>
#include <iostream>
class CString
{
public:
CString(char const*) {}
};
class TestBed
{
public:
void Comparison(CString const&) { std::cout << "CString Overload" << std::endl; }
void Comparison(std::string const&) { std::cout << "std::string overload" << std::endl; }
};
int main()
{
TestBed tb;
tb.Comparison("Hello World");
}
此代碼無法編譯,因為對Comparison()
的調用不明確。 我期待這種行為。
但是,當我創建任何一個Comparison()
重載const
,如: void Comparison(std::string const&) const
或void Comparison(CString const&) const
(但不是兩者),代碼編譯並選擇非const超載。
重載解析規則非常復雜,我還沒有看到任何描述const
如何影響這種情況的東西。 我的理解是:
在這兩種情況下,1和2都是模棱兩可的。 有人可以解釋一下嗎? 謝謝。
對於類方法, this
部分被視為額外參數。 因此,如果您將CString
設為一個const,則會設置重載:
Comparison(const TestBed&, CString const&) // (1)
Comparison(TestBed&, std::string const&) // (2)
對於(1)
,我們需要進行兩次轉換: const
轉換和轉換為CString
。 但對於(2)
,我們只需要進行一次轉換:到std::string
。 因此, (2)
是優選的。
我們可以通過添加為此進行一次轉換的第三個函數來驗證這this
:
Comparison(const TestBed&, const char*) // (3)
在這里,我們再次只有一個轉換(在“第一個”參數中),因此重載集是不明確的。
在[over.match.funcs]中:
成員函數被認為有一個額外的參數,稱為隱式對象參數,它表示已調用成員函數的對象。 出於重載解析的目的,靜態和非靜態成員函數都具有隱式對象參數,但構造函數不具有。
對於非靜態成員函數,隱式對象參數的類型是
- 對於沒有引用限定符或使用&ref-qualifier聲明的函數的“對cv X的左值引用”
- 對於使用&& ref-qualifier聲明的函數的“對cv X的rvalue引用”
其中X是函數所屬的類,cv是成員函數聲明的cv-qualification。 [示例:對於類X的const成員函數,假設額外參數具有類型“對const X的引用”。 - 末端的例子]
在重載解析期間,隱含的對象參數與其他參數無法區分。
這就證明了為什么我們考慮const TestBed&
vs TestBed&
。 然后只是比較重載(1)
和(2)
之間的轉換序列。 對於第二個參數,兩個轉換序列都相等,但對於第一個參數, (2)
具有更好的轉換序列(即Exact) - 這就是為什么它沒有歧義地獲勝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.