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。
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。
C++ ISO 仕様、§26.2/2 によると:
または
complex以外の型のテンプレートをfloatインスタンス化した場合の効果は規定されていません。doublelong double
つまり、コンパイラは、インスタンス化するときに必要なことを何でも実行できますcomplex<int>。ここで 0 を取得しているという事実は、言語の観点から完全に明確に定義された動作です。
比較のために - ideone の gcc のバージョンでは、このコードはコンパイルさえしません。これはもう 1 つの完全に有効なオプションです。
お役に立てれば!
MinGW 4.6.2 では200.
ただし、C++ ISO 標準セクション 26.2.2 では:
または
complex以外の型のテンプレートをfloatインスタンス化した場合の効果は規定されていません。doublelong double
そのため、ビルド環境は に対して未定義の動作を示していますがcomplex<int>、これは標準に反していません。
templatetypedef指摘されたように、ideoneの C99 コンパイラ(GCC 4.3.4) は、それを完全にコンパイルすることを拒否します。