Рассмотрят следующий код, который иллюстрирует некоторые преобразования сужения:Force предупреждение сужая преобразование
template <class T>
class wrapper
{
template <class> friend class wrapper;
public:
constexpr wrapper(T value)
: _data(value)
{}
template <class U>
constexpr wrapper(wrapper<U> other)
: _data(other._data)
{}
wrapper& operator=(T value)
{_data = value; return *this;}
template <class U>
wrapper& operator=(wrapper<U> other)
{_data = other._data; return *this;}
private:
T _data;
};
int main(int argc, char* argv[])
{
wrapper<unsigned char> wrapper1 = 5U;
wrapper<unsigned char> wrapper2{5U};
wrapper<unsigned char> wrapper3(5U);
wrapper<unsigned int> wrapper4 = 5U;
wrapper<unsigned int> wrapper5{5U};
wrapper<unsigned int> wrapper6(5U);
wrapper<unsigned char> wrapper7 = wrapper4; // Narrowing
wrapper<unsigned char> wrapper8{wrapper5}; // Narrowing
wrapper<unsigned char> wrapper9(wrapper6); // Narrowing
wrapper7 = wrapper4; // Narrowing
wrapper8 = wrapper5; // Narrowing
wrapper9 = wrapper6; // Narrowing
return 0;
}
Как изменить тело из wrapper
членов, так что это вызывает предупреждение компилятора для сокращения преобразования? Моя цель - информировать пользователя о том, что что-то не так с их кодом.
Где сужается? Вы копируете инициализацию из одного и того же типа в 7, 8 и 9. – NathanOliver
Интересно, что есть '-Wnarrowing', но он ничего не делает. В этом случае сужение ошибок становится намного проще. – krzaq
@NathanOliver Спасибо, исправлена проблема. – Vincent