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