2017-10-11 6 views
9

次のコードでは、unscoped enumerationlong longと定義しています。このプログラムはClangで正常に動作します。GCC:範囲指定されていない列挙型で曖昧さエラーが発生する

しかし、GCCコンパイラはあいまいなエラーを返します。

#include <iostream> 

enum : long long { Var=5 }; 

void fun(long long ll) 
{ 
    std::cout << "long long : " << ll << std::endl; 
} 

void fun(int i) 
{ 
    std::cout << "int : " << i << std::endl; 
} 

int main() 
{ 
    fun(Var); 
} 

GCC発生したエラー:

main.cpp: In function 'int main()': 
main.cpp:17:12: error: call of overloaded 'fun(<unnamed enum>)' is ambiguous 
    fun(Var); 
      ^
main.cpp:5:6: note: candidate: void fun(long long int) 
void fun(long long ll) 
     ^~~ 
main.cpp:10:6: note: candidate: void fun(int) 
void fun(int i) 
     ^~~ 

なぜGCCコンパイラが曖昧エラーを与えるのでしょうか?

答えて

12

GCCが間違っています。その基礎となる型に変換

スコープ外列挙型である修飾integral promotionとして:

その基底型固定されて、...(C++ 11以降)その基礎となる型に変換することができるスコープ外の列挙型

Varintために変換しつつ、(long longからintに)integral conversionもう一つを必要とします。

2)促進:積分プロモーション、浮動小数点促進

3)変換:積分変換、浮動小数点変換、 フローティング積分促進overload resolution積分変換よりも高いランクを有しますインライン変換、ポインタ変換、ポインタへのポインタ 変換、ブール変換、派生した クラスのベースへのユーザー定義変換

次にfun(long long ll)がよりよく一致する必要があります。


Hereさんのgccのバグレポートです。それは2017年10月24日に修正されました。 LIVE

関連する問題