[英]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:
給定這些定義,如果對於所有參數i , ICS i (
F1
)不是比ICS i (F2
)更差的轉換序列,則可行函數F1
被定義為比另一個可行函數F2
更好的函數,然后
對於某些參數j , ICS j (
F1
)是比ICS j (F2
)更好的轉換序列, 或者,如果不是 ,上下文是由用戶定義的轉換初始化(見8.5,13.3.1.5和13.3.1.6) ,從返回類型
F1
到目標類型的標准轉換序列(即,被初始化的實體的類型)是比從返回類型F2
到目標類型的標准轉換序列更好的轉換序列 。
因此,作為引用的隱式對象參數不是operator char*
的const
reference,根據第一個項目符號點,它是更好的匹配。
a
是aa
的非const實例,因此非const轉換運算符是比const(更好)(需要添加常量)更好(精確)匹配,即使返回類型也不匹配。
你的“aa”對象不是const,所以C ++更喜歡非const轉換。
如果你使“aa”const,那么將使用const bool()轉換運算符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.