2016-07-30 14 views
1

Visual Studio 2015アップデート3. C++ 11 \ C++ 14。 intについてはユニバーサルで均一な初期化: `double`から` int`

constexpr int ci1 {50}; 
constexpr int ci2 {500}; 

char c1 {ci1}; // OK 
char c2 {ci2}; // compilation error 

すなわち、 ユニバーサルで均一な初期化は、コンパイルモード(intchar)の値をチェックできます。この例は、Bjarne Stroustrupによって彼の著書に掲載されました。

は、私は、これはdoubleintにケースのために真であることを期待、しかしそれは、Visual Studio 2015 Update 3のために動作しません:

constexpr double cd {4.0}; 
int i1 {cd}; // compilation error 

エラーメッセージ:

C2397変換から'double'から 'int'までの範囲は狭くする必要があります 変換

私の2番目のコード例では正しい動作ですか、それともVisual Studio専用ですか?

+0

あなたの投稿にコンパイルエラーを含めてください。 –

+3

ソース値にかかわらず、浮動小数点から整数への無条件絞り込みが行われます。 [\ [dcl.init.list \]/7](http://eel.is/c++draft/dcl.init.list#7)を参照してください。 –

+0

エラーメッセージを追加しました。 –

答えて

0

double型からint型への変換は狭くなります。なぜなら、double型は有理数を表すからです。 (0.5)正確である必要はない(1.は1.000000001である)ので、変換は情報を失う。

このような変換には明示的なキャストを使用してください。すべて正常に行われるか、普遍的な初期化は使用されません。

1

double~int変換は常に縮小と見なされるため、Bjarne Stroustrupはこのようなキャストのための書籍でnarrow_cast<>の実装を作成しています。

+0

しかし、なぜですか?同様の例では、元の値が歪まずに変換が行われます。この状況は私のコードの最初の変種と何が違うのですか? –

+0

@Andrey私はいくつかの実装では、AFAIK標準では全体の値を2倍で正確に表現する必要はないため、理論的には歪みを含むと考えています –

関連する問題