我注意到在C++中,bool被隐式转换为char。我意识到它们都存储为1字节,但它们是根本不同的类型。是否有一些编译器标志或我可以设置的东西来防止两者之间的隐式转换?char
被自动转换为bool
是有意义的,但不是相反。
例如,以下内容有效:
char test = true;
我正在使用带有C++17 的Xcode
此转换是C++标准强制执行的(整数转换的一部分(,因此不可能禁用此转换并保持兼容的C++编译器。
编译器可能会提供不兼容的扩展,但对于这样的扩展,他们可能更喜欢警告而不是不兼容。然而,我找不到一个编译器提供这样的警告(例如,请参阅No warning for implicit cast of bool to floating type(。
尽管如此,答案可能以非编译器工具的形式存在。看起来clang整洁包含了对来自bool的隐式转换的检查。
以下是基于@Eljay的评论的可能解决方案:
template<typename T, typename U>
T strict(U u)
{
static_assert(std::is_same_v<T, U>);
return u;
}
然后你可以这样使用它:
char test = strict<char>(true); // error
char test = strict<char>('a'); // ok
这是一个演示。
char是int,所以转换是可以的。
若你们不想发生这种情况,你们可以用相同的名字做函数,但用bool作为参数。你只能做定义,所以如果你用bool调用它,它会编译,但不会链接。
一旦我在电脑上,就会给你看例子