【发布时间】:2015-06-01 20:53:56
【问题描述】:
为什么下面的代码在clang++中编译?
是否有任何 c++ 标志来防止这种情况发生 - 我希望编译器抛出错误,因为我将 std::uint64_t 作为参数传递给接受 std::uint16_t 的函数。
#include <cstdint>
using namespace std;
void foo(uint16_t x) {
}
int main() {
uint64_t x = 10000;
foo(x);
return 0;
}
【问题讨论】:
-
C++ 中允许缩窄转换,无符号缩窄转换是明确定义的
-
添加
-Werror=conversion将导致您的示例无法编译。 -
..或者只是
-Wall -Wextra -Werror -pedantic -
@JohnBollinger 简单:容易出错。
uint16_t和uint64_t是不同的类型。这些隐式转换引起了足够的头痛。我建议始终将警告级别设置得足够高以涵盖此类情况。