narrowing в конструкторе
От: Кодт Россия  
Дата: 04.07.24 10:42
Оценка: 11 (1)
https://gcc.godbolt.org/z/58rn3vWo8 — gcc
https://gcc.godbolt.org/z/b85afvPn6 — clang

struct Foo {
    Foo(const char*, unsigned int) {}
};

int main() {
    unsigned long l = 0;
    Foo f("ahaha", l);  // тут всё ок

    Foo g{"ahaha", l};
    // gcc   --- warning: narrowing conversion of 'l' from 'long unsigned int' to 'unsigned int' [-Wnarrowing]
    // clang --- error: non-constant-expression cannot be narrowed from type 'unsigned long' to 'unsigned int' in initializer list [-Wc++11-narrowing]
}


Я чот туплю. Да, сужение типа — это плохо (хотя в боевом коде я сделаю статик-каст, потому что мамой клянус, там меньше 4 гигов), но почему в ()-конструкторе компиляторы съели молча, а в {}-конструкторе стали ругаться? Да ещё и с разными уровнями критичности, при том, что я никому из них не сказал -Werror.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.