防止从bool到char的隐式转换 我注意到C++中的BoL隐式地转换成字符。我意识到它们都存储为1字节,但它们的类型根本不同。是否有一些编译器标志或我可以设置的东西来防止两者之间的隐式转换char自动转换为bool是有意义的,但不是相反
例如,以下内容是有效的:防止从bool到char的隐式转换 我注意到C++中的BoL隐式地转换成字符。我意识到它们都存储为1字节,但它们的类型根本不同。是否有一些编译器标志或我可以设置的东西来防止两者之间的隐式转换char自动转换为bool是有意义的,但不是相反,c++,char,boolean,implicit-conversion,C++,Char,Boolean,Implicit Conversion,例如,以下内容是有效的: char test = true; 我使用C++ C++ 17 这个转换是由C++标准(部分)强制的,因此不可能禁用这个转换并保持一个兼容的C++编译器。 编译器可以提供不兼容的扩展,但是对于类似的事情,他们可能更喜欢警告而不是不兼容。但是,我找不到提供此类警告的编译器(例如,请参见) 不过,答案可能以非编译器工具的形式存在。它看起来包括。根据@Eljay的评论,这里有一个可能的解决方案: template<typename T, typename U>
char test = true;
我使用C++ C++ 17 这个转换是由C++标准(部分)强制的,因此不可能禁用这个转换并保持一个兼容的C++编译器。 编译器可以提供不兼容的扩展,但是对于类似的事情,他们可能更喜欢警告而不是不兼容。但是,我找不到提供此类警告的编译器(例如,请参见)
不过,答案可能以非编译器工具的形式存在。它看起来包括。根据@Eljay的评论,这里有一个可能的解决方案:
template<typename T, typename U>
T strict(U u)
{
static_assert(std::is_same_v<T, U>);
return u;
}
模板
T严格(U)
{
静态断言(std::is_same_v);
返回u;
}
然后你可以这样使用它:
char test = strict<char>(true); // error
char test = strict<char>('a'); // ok
char test=strict(true);//错误
字符测试=严格('a');//好啊
这里有一个。字符是int,所以转换是可以的 如果您不希望发生这种情况,可以使用相同的名称执行函数,但使用bool作为参数。您只能进行定义,因此如果您使用bool调用它,它将编译,但不会链接
当我在PC上时,我将向您展示一个示例“自动将字符转换为bool是有意义的,但不是相反。”您确定吗?似乎与我相反。每个
bool
都适合于char
,但不是相反。你用什么来编译?@tedlynmo抱歉,阅读你的评论时没有意识到你引用了OP.char test=strict(true)代码>将无法编译。只需要将模板类设置为严格的模板类,该类不允许任何非该类型的内容。我认为最好的答案是:接受它。它是C++很久以前做出的选择。这不太好,但对抗它更糟。很好!这比我拼凑的东西更干净更简单。