1 + 1i
は、C99の_Complex int
タイプと同様の/同等のタイプを作成する(GCC)拡張を使用しています。このタイプは、int
またはdouble
のような実タイプに変換可能です。 std::complex
は_Complex
と互換性がなく、_Complex
(*)からstd::complex
を作成するコンストラクタはありません。しかし、std::complex<T>
には、T
が必要なコンストラクタがあります。これにより前述の変換が行われます_Complex
- >T
- >std::complex<T>
#include <complex>
#include <iostream>
int main()
{
double d = 1+1i;
std::complex<double> a = d;
std::cout<<"a ="<<a<<"\n";
return 0;
}
1 + 1i
の虚数部がdouble
への変換中に滴下する。
だからOPのコードは同等です。
な驚きを防止するために、警告や-pedantic
でコンパイルしてみてください。この例では、(gccのために、-pedantic
は、多くの状況で警告出力を変更)打ち鳴らすが、実際に-pedantic
フラグを使用して追加の警告を追加する数少ない場所の一つであるように思わ:
prog.cc:6:19: warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]
double d = 1+1i;
(*)IIRC、 std::complex
がC++ 98に導入され、_Complex
がC99に導入されました。
出典
2016-11-24 13:07:29
dyp
正常に動作するようです:http://ideone.com/Qa7698ある時点で再コンパイルするのを忘れましたか? –
Apple LLVMバージョン8.0.0(clang-800.0.42.1)を使用していました。 g ++ではない!投稿を編集します – Coniferous
'using namespace std :: literal :: complex_literals;'という宣言を追加するとどうなりますか? – StoryTeller