簡體   English   中英

C ++重載決策,轉換運算符和常量

[英]C++ overload resolution, conversion operators and const

在這種情況下

void f(int *);
void f(const int *);
...
int i;
f(&i);

情況很清楚 - f(int *)被調用似乎是正確的。

但是,如果我有這個(這是錯誤的(*)):

class aa
{
public:
    operator bool() const;
    operator char *();
};

void func(bool);

aa a;
func(a);

運算符char *()被調用。 我無法弄清楚為什么這樣的決策路徑會比去操作員bool()更好。 有任何想法嗎?

(*)如果將const添加到第二個運算符,則代碼按預期工作。

因為用於與轉換操作符返回類型為目標類型(即轉化用戶定義的轉換char*bool )的對象參數轉換之后被認為是,即,對象參數的轉換a隱式對象參數。 [over.match.best] / 1:

給定這些定義,如果對於所有參數iICS i F1 不是比ICS i F2 更差的轉換序列,則可行函數F1被定義為比另一個可行函數F2更好的函數,然后

  • 對於某些參數jICS j F1 是比ICS j F2 更好的轉換序列, 或者,如果不是

  • 上下文是由用戶定義的轉換初始化(見8.5,13.3.1.5和13.3.1.6) ,從返回類型F1到目標類型的標准轉換序列(即,被初始化的實體的類型)是比從返回類型F2到目標類型的標准轉換序列更好的轉換序列

因此,作為引用的隱式對象參數不是operator char*const reference,根據第一個項目符號點,它是更好的匹配。

aaa的非const實例,因此非const轉換運算符是比const(更好)(需要添加常量)更好(精確)匹配,即使返回類型也不匹配。

你的“aa”對象不是const,所以C ++更喜歡非const轉換。

如果你使“aa”const,那么將使用const bool()轉換運算符。

暫無
暫無

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

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