厳密な C++ コンパイラ - 関数のオーバーロード解決

提供: Appmethod Topics
移動先: 案内検索

より厳密な C++ コンパイラ(Appmethod C++ 2007):インデックス への移動


Appmethod C++ 2007 コンパイラが旧バージョンから最も大きく変わった領域は、あいまい性の検出を含むオーバーロード解決に関してです。 このコンパイラは、2003 C++ ANSI 規格のセクション 13.3 の規則にさらに適合するようになりました。 以前は許されていた部分が、あいまいである、または一致しないと報告されるようになり、その意図を明確にするために修正を求められます。

新しい厳密な処理を強制せずに、古い処理に戻すコンパイラ オプションは、-Vbo です。 ただし、コンパイラの変更点のすべてをこのスイッチによって制御できるわけではありませんので、コードを更新することをお勧めします。

旧バージョンのコンパイラでは許されたあいまい性の例を次に示します。

class X{};
  void foo(X);
  void foo(const X&);
  void ambig() {
    X x;
    foo(x); //error-ambiguous-the previous compiler chose 'void foo(x)'
  }

std::abs() のあいまい性

標準の abs 関数でもあいまい性エラーが発生する場合があります。 それは、さまざまにオーバーロードされた abs が要求する型のいずれとも正確に一致しないパラメータが渡された場合です。 次に例を示します。

#include <limits>bool test(long l) {   return std::abs(l)> 0;} 

上のコードは、次のコンパイル エラーと警告を出力します。

Error E2015 test.cpp 5: Ambiguity between 'std::abs(int) at C:\dev\tp\sc\include\math.h:208' and 'std::abs(long double) at C:\dev\tp\sc\include\math.h:275' in function test(long)
Warning W8057 test.cpp 6: Parameter 'l' is never used in function test(long)

これを解決するには、呼び出したいオーバーロードの型にキャストします。 以下はその例です。

  #include <limits>bool test(long l) {   return std::abs(static_cast<int>(l)) > 0;}


関連項目