18

0私の予想に反して、VS2010 を使用した次のコードは を出力します。

#include <complex>
#include <iostream>

using namespace std;

int main(void)
{
    complex<int> z(20, 200);
    cout << abs<int>(z) << endl;
    return 0;
}

タイプが の場合は正常に動作しますdouble

4

2 に答える 2

23

C++ ISO 仕様、§26.2/2 によると:

またはcomplex以外の型のテンプレートをfloatインスタンス化した場合の効果は規定されていません。doublelong double

つまり、コンパイラは、インスタンス化するときに必要なことを何でも実行できますcomplex<int>。ここで 0 を取得しているという事実は、言語の観点から完全に明確に定義された動作です。

比較のために - ideone の gcc のバージョンでは、このコードはコンパイルさえしません。これはもう 1 つの完全に有効なオプションです。

お役に立てれば!

于 2012-06-19T20:11:58.807 に答える
6

MinGW 4.6.2 では200.

ただし、C++ ISO 標準セクション 26.2.2 では:

またはcomplex以外の型のテンプレートをfloatインスタンス化した場合の効果は規定されていません。doublelong double

そのため、ビルド環境は に対して未定義の動作を示していますがcomplex<int>、これは標準に反していません。

templatetypedef指摘されたように、ideoneの C99 コンパイラ(GCC 4.3.4) は、それを完全にコンパイルすることを拒否します。

于 2012-06-19T20:13:01.217 に答える