防止从 bool 到 char 的隐式转换
Prevent implicit conversion from bool to char
我注意到在 C++ 中 bool 被隐式转换为 char。我意识到它们都存储为 1 个字节,但它们是根本不同的类型。是否有一些编译器标志或我可以设置的东西来防止两者之间的隐式转换? char
自动转换为 bool
是有道理的,但反之则不然。
例如,以下是有效的:
char test = true;
我正在使用 Xcode 和 C++17
此转换由 C++ 标准(integral conversions 的一部分)强制执行,因此无法禁用此转换并保持兼容的 C++ 编译器。
编译器可以提供 non-compliant 扩展,但对于这样的事情,他们可能更喜欢警告而不是继续 non-compliant。但是,我找不到提供此类警告的编译器(例如,参见 No warning for implicit cast of bool to floating type)。
不过,答案可能以 non-compiler 工具的形式存在。看起来像 clang-tidy includes a check for implicit conversions from 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
这是一个demo。
char是int,可以转换。
如果您不希望这种情况发生,您可以使用相同的名称来执行函数,但使用 bool 作为参数。你只能做定义,所以如果你用 bool 调用它,它会编译但不会 link.
我一上电脑就给你看例子
我注意到在 C++ 中 bool 被隐式转换为 char。我意识到它们都存储为 1 个字节,但它们是根本不同的类型。是否有一些编译器标志或我可以设置的东西来防止两者之间的隐式转换? char
自动转换为 bool
是有道理的,但反之则不然。
例如,以下是有效的:
char test = true;
我正在使用 Xcode 和 C++17
此转换由 C++ 标准(integral conversions 的一部分)强制执行,因此无法禁用此转换并保持兼容的 C++ 编译器。
编译器可以提供 non-compliant 扩展,但对于这样的事情,他们可能更喜欢警告而不是继续 non-compliant。但是,我找不到提供此类警告的编译器(例如,参见 No warning for implicit cast of bool to floating type)。
不过,答案可能以 non-compiler 工具的形式存在。看起来像 clang-tidy includes a check for implicit conversions from 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
这是一个demo。
char是int,可以转换。
如果您不希望这种情况发生,您可以使用相同的名称来执行函数,但使用 bool 作为参数。你只能做定义,所以如果你用 bool 调用它,它会编译但不会 link.
我一上电脑就给你看例子