簡體   English   中英

成員函數的const修飾符如何影響重載決策?

[英]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&) constvoid Comparison(CString const&) const (但不是兩者),代碼編譯並選擇非const超載。

重載解析規則非常復雜,我還沒有看到任何描述const如何影響這種情況的東西。 我的理解是:

  1. 首先選擇具有精確匹配參數的函數
  2. 接下來嘗試1級隱式轉換

在這兩種情況下,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.

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