5

g++それを-std=c++11受け入れるようです:

#include <vector>
#include <initializer_list>

std::vector<float> vf={1,2,3}; // Isn't this narrowing (i.e., an error)?

int main() {}

コメントのある行はエラーになるはずですが、そうではありません。

アップデート

これが問題ない理由を定義する標準 (8.5.4 p7) を指摘してくれた Jesse に感謝します。標準で定義されている動作を明確にするのに役立つサンプル コードを次に示します。

const int v5=5;
int v6=6;

vector<double> vd1={1,2,3,4};       // OK
vector<double> vd2={1,2,3,4,v5};    // Still OK, v5 is const
vector<double> vd3={1,2,3,4,v5,v6}; // Error, narrowing conversion, because v6 
                                    // is non-const
vector<double> vd4={1,2,3,4,v5,static_cast<const int>(v6)}; // Also errors on 
                                    // gcc 4.7.2, not sure why.

今紹介した例が、初期化子リストを使用する際の狭い問題を乗り越えるのに役立つことを願っています。

最後のケースが標準定義に違反する理由を誰かが知っている場合は、コメントを投稿してください。

4

2 に答える 2

7

3 つの整数すべてを として正確に表すことができるのに、なぜこれがエラーになるのかわかりませんfloat

そうは言っg++ても、 a に収まらない定数を含めると、警告を表示できfloatます。

warning: narrowing conversion of '2112112112' from 'int' to 'float' inside { } [-Wnarrowing]
于 2013-03-08T15:18:09.713 に答える