2016-11-24 3 views
1

私は、Apple LLVMバージョン8.0.0(打ち鳴らす-800.0.42.1)を使用してコンパイルし、私が手に出力がのstd ::複雑なinitilalisation問題

a =(1,0) 
ある場合は、次のコード

#include <complex> 
#include <iostream> 

int main(int argc, char **argv) 
{ 
    std::complex<double> a = 1+1i; 
    std::cout<<"a ="<<a<<"\n"; 
    return 0; 
} 

を考えてみましょう

なぜ虚数部分がゼロで初期化されるのか説明できますか?

+0

正常に動作するようです:http://ideone.com/Qa7698ある時点で再コンパイルするのを忘れましたか? –

+0

Apple LLVMバージョン8.0.0(clang-800.0.42.1)を使用していました。 g ++ではない!投稿を編集します – Coniferous

+2

'using namespace std :: literal :: complex_literals;'という宣言を追加するとどうなりますか? – StoryTeller

答えて

2

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に導入されました。

関連する問題