簡體   English   中英

C++中重載函數和多個轉換運算符的歧義,編譯器不同意

[英]Overloaded function and multiple conversion operators ambiguity in C++, compilers disagree

在下面的程序中,struct S提供了兩個轉換運算符:in double和 in long long int 然后將S類型的對象傳遞給函數f ,為floatdouble重載:

struct S {
    operator double() { return 3; }
    operator long long int() { return 4; }
};

void f( double ) {}
void f( float ) {}

int main() {
    S s;
    f( s );
}

MSVC 編譯器可以很好地接受程序,選擇f( double )重載。 然而 GCC 和 Clang 在f的調用中都看到了歧義,演示: https : //gcc.godbolt.org/z/5csd5dfYz

似乎 MSVC 就在這里,因為轉換: operator long long int() -> f( float )不是促銷。 這是錯的嗎?

有一個類似的問題Overload resolution with multiple functions and multiple conversion operators ,但是里面有一個promotion case,現在所有的編譯器都同意,不像這個問題的情況。

Gcc 和 Clang 是正確的。 隱式轉換序列(用戶定義的轉換序列)是無法區分的。

[ over.ics.rank/3 :

(強調我的)

兩個相同形式的隱式轉換序列是不可區分的轉換序列,除非以下規則之一適用:

...

(3.3) 如果用戶定義的轉換序列 U1包含相同的用戶定義的轉換函數或構造函數,或者它們在聚合初始化中初始化相同的類,則用戶定義的轉換序列 U1 是比另一個用戶定義的轉換序列 U2 更好的轉換序列。 U1 的標准轉換序列優於 U2 的第二個標准轉換序列。

用戶自定義轉換序列涉及兩種不同的用戶自定義轉換函數( operator double()operator long long int() ),編譯器無法選擇其中之一; 不會考慮第二個標准轉換序列。

暫無
暫無

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

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