G ++ ложно выбрасывает -Warrowing? - PullRequest
1 голос
/ 06 марта 2020

Это G CC 7.4, работающий в режиме C ++ 14:

        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, как показано здесь .

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Компиляция с помощью 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, ' ');
2 голосов
/ 06 марта 2020

Использование фигурных скобок предпочитает конструктор списка (тот, который принимает std::initializer_list<char> здесь, номер 9 на cppreference). В этом конструкторе элементы char, так что это сужающее преобразование. G CC выдаст вам настоящую ошибку, а не только предупреждение, если вы скомпилируете с -pedantic-errors; это не соответствующая программа, потому что сужающие преобразования не допускаются при фигурной инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...