C++ 是g++;错误的投掷-箭头?

C++ 是g++;错误的投掷-箭头?,c++,c++14,gcc-warning,type-narrowing,C++,C++14,Gcc Warning,Type Narrowing,这是在C++14模式下运行的GCC 7.4: size_t i = 8; std::string strIndent { i, ' ' }; 看起来不错,但我得到了警告: AnalyticsDBI.cpp:538:48: warning: narrowing conversion of ‘i’ from ‘size_t {aka long unsigned int}’ to ‘char’ inside { } [-Wnarrowing]

这是在C++14模式下运行的GCC 7.4:

        size_t i = 8;
        std::string strIndent { i, ' ' };
看起来不错,但我得到了警告:

AnalyticsDBI.cpp:538:48: warning: narrowing conversion of ‘i’ from ‘size_t {aka long unsigned int}’ to ‘char’ inside { } [-Wnarrowing]
                 std::string strIndent { i, ' ' };

这是一个编译器错误?我无法理解编译器如何选择错误的重载。应该是构造函数2,如图所示。

使用大括号的首选列表构造函数(此处使用
std::initializer\u list的构造函数,参考编号9)。在这个构造函数中,元素是
char
,因此它是一个缩小的转换。如果您使用
-学究式错误编译,GCC将为此提供实际错误,而不仅仅是警告;这不是一个符合要求的程序,因为在带括号的初始化中不允许缩小转换。

使用clang编译表明它试图调用
初始值设定项列表
构造函数,其中
size\u t->char
是缩小转换:

narrowing.cpp:5:26: error: non-constant-expression cannot be narrowed from type 'size_t' (aka 'unsigned long') to 'char' in initializer list [-Wc++11-narrowing]
        std::string strIndent { i, ' ' };
                                ^
narrowing.cpp:5:26: note: insert an explicit cast to silence this issue
        std::string strIndent { i, ' ' };
                                ^
                                static_cast<char>( )
1 error generated.

那么,如果我想要这个构造函数,我是否必须使用括号?@ThomasMcLeod,是的,在使用大括号调用标准容器的非列表构造函数时,遇到这样的陷阱并不罕见。(你可能会和许多人一样认为情况不理想。)
 std::string strIndent(i, ' ');