为了防止“意外问题”,使用格式指定在其他模块中定义类型的位置,我正在寻找一个转换运算符,它在缩小转换时将无法编译:这表示需要解决的基本类型错误。
例如,在最近从兼容类型更改为不兼容类型的某些外部标头中使用:
namespace y {
using X = uint64_t; // "recent change", was previously int32_t
}
目标是让它失败(错误不是警告作为错误),因为结果用作"%d
.
y::X a; // question covers ANY value in domain of X, not if overflow at run-time
int32_t r = cast_that_fails_to_compile_if_can_narrow<int32_t>(a);
// So this is guaranteed to always be a valid type specifier
// (per http://www.cplusplus.com/reference/cstdio/printf/)
// for the provided argument if the cast/code above compiles.
printf("%d", r);
(在这种情况下,棘手的缩小问题应该通过额外的代码更改来处理。)