如何让C++编译器在传入负整数到无符号参数时报错而非溢出?
解决unsigned int接收负数隐式转换不报错的问题
- 用编译器警告强制报错:
用GCC或Clang编译时,添加-Wsign-conversion参数,会对有符号整数转无符号整数的隐式转换发出警告;如果想直接让这种情况变成编译错误,就用-Werror=sign-conversion,把该类型的警告升级为错误。比如你写Profile p("张三", -1);这种代码时,编译阶段就会直接报错,不会让负数隐式转成无符号的超大值。 - 进阶:用编译期检查限制类型(配合编译器选项效果更好):
给Profile的构造函数加上explicit修饰,避免隐式类型转换;同时可以用模板结合static_assert,在编译期确保传入的年龄是无符号类型。示例代码:
不过这种方法要求调用时必须传入无符号类型的数值,要是不小心传了#include <type_traits> #include <string> class Profile { public: template<typename T> explicit Profile(std::string name, T age) { static_assert(std::is_unsigned_v<T>, "年龄必须使用无符号整数类型"); // 这里写初始化姓名和年龄的逻辑 } };int类型的-1,还是会触发隐式转换问题,所以最好和前面的编译器选项搭配使用。
内容的提问来源于stack exchange,提问作者a_floating_point
相关产品推荐
相关产品推荐

