这是在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,如图here所示。
使用花括号更喜欢列表构造器(这里使用std::initializer_list<char>
的那个,cppreference上的数字9)。在此构造函数中,元素为char
,因此这是一个缩小的转换。如果您使用-pedantic-errors
进行编译,GCC会为您提供实际的错误,而不仅仅是警告。这不是合格程序,因为在括号初始化中不允许缩小转换。
使用clang进行编译表明它正在尝试调用initializer_list<char>
是缩小转换的size_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.
使用()会调用您想要的构造函数:
std::string strIndent(i, ' ');