g ++是否会错误地抛出-Wnarrowing?

问题描述 投票:0回答:2

这是在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所示。

c++ c++14 gcc-warning type-narrowing
2个回答
1
投票

使用花括号更喜欢列表构造器(这里使用std::initializer_list<char>的那个,cppreference上的数字9)。在此构造函数中,元素为char,因此这是一个缩小的转换。如果您使用-pedantic-errors进行编译,GCC会为您提供实际的错误,而不仅仅是警告。这不是合格程序,因为在括号初始化中不允许缩小转换。


1
投票

使用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, ' ');
© www.soinside.com 2019 - 2024. All rights reserved.