簡體   English   中英

為什么以下帶有非const轉換函數的代碼不含糊?

[英]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.

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