![](/img/trans.png)
[英]c++ Using a a template function with enum class and overloaded conversion operators
[英]Overloaded function and multiple conversion operators ambiguity in C++, compilers disagree
在下面的程序中,struct S
提供了兩個轉換運算符:in double
和 in long long int
。 然后將S
類型的對象傳遞給函數f
,為float
和double
重載:
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.