[英]Why is inheritance of a const/non-const function overload ambiguous?
[英]Why the following code with non-const conversion function is not ambiguous?
請考慮以下代碼(摘自https://en.cppreference.com/w/cpp/language/cast_operator )
struct To {
To() = default;
To(const struct From&) {} // converting constructor
};
struct From {
operator To() const {return To();} // conversion function
};
int main()
{
From f;
To t2 = f; // copy-initialization: ambiguous
// (note, if conversion function is from a non-const type, e.g.
// From::operator To();, it will be selected instead of the ctor in this case)
}
正如評論所說,以下行確實含糊不清,因為有兩個候選者(轉換函數和轉換構造函數同樣適用)
To t2 = f; //compile error
但是,正如筆記所說,如果我從conversion
函數中刪除const
,導致以下代碼:
struct From {
operator To() {return To();} // conversion function
};
電話編譯很好。
const
限定符不應該影響conversion
函數的返回值,那么為什么調用不再含糊不清?
const限定符不應該影響轉換函數的返回值,那么為什么調用不再含糊不清?
它不會影響結果,但它會影響重載分辨率以選擇最佳可行方法。 它類似於這些組成功能的情況
To make(From const&);
To make(From&);
哪個重載是make(f)
更好的匹配? 這是第二個,因為參數類型是非const,更好地匹配參數( f
),它本身是非const。
const限定符不應影響轉換函數的返回值
它確實沒有影響,但這也無關緊要。
它的真正影響是論點-這是隱式引用this
。 隱式參數是const成員函數的const值和非const成員函數的非const。 參數是影響重載決策的因素。
在原始代碼中,構造函數和轉換運算符參數完全相同,因此從任何類型到任一參數的轉換序列同樣可取,因此不明確。
沒有const,你的非const左值表達式f
不需要任何轉換,而構造函數確實需要轉換為const左值。 因此,過載分辨率優選操作員。 如果你寫了const From f;
,然后選擇其參數為const的構造函數,因為在這種情況下,非const轉換運算符甚至不是有效的候選者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.