防止从false到指针的静默强制转换
Prevent silent cast from false to pointer
我有一个函数
void foo(int *bar)
{}
如果我这样调用foo:,Visual Studio 2012现在将愉快地编译,并且没有警告
int main()
{
foo(false);
return 0;
}
然而,如果我将foo(false)更改为foo(true),我会得到一个错误:
1>main.cpp(132): error C2664: 'foo' : cannot convert parameter 1 from 'bool' to 'int *'
1> Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
知道我如何确保在传递false时也会出错吗?我唯一的想法是添加第二个私有函数"void foo(bool bar)"。然后我确实得到了所需的错误,声明foo(bool-bar)是私有的。但这只适用于从类外调用foo并且它扰乱了我的接口的情况。
首先,关于它为什么接受false
而不接受true
:文字false将被解释为积分0
,文字0
将转换为任何类型的空指针。CCD_ 5不能转换为指针类型,因为它转换为积分CCD_。
至于如何解决您的问题:只要您不实现私有重载,您使用额外bool
重载的方法对公共和非公共调用方都适用。在这种情况下,公共调用方将得到编译错误,成员调用方将获得链接器错误。
不过,您可能还需要考虑其他事项。
你的函数需要接受空指针吗?如果没有,请将其更改为通过引用接受,问题就会消失。
如果你的函数真的需要接受空指针,那么在这种情况下,我建议相信你的用户会正确调用它,而不是为了防止每一次可能的滥用而扰乱你的界面。
在C++11中,您可以编写:
void foo(bool) = delete; // cannot be use by anybody (class itself included).
由于vs2012不支持= delete
,
您可以使用SFINAE:尝试此破解
template <typename T>
typename std::enable_if<std::is_same<T, int>::value, void>::type
foo(T* t);
使用旧的C++98方式"私有而不实现":
private: // Fail to compile from outside
void foo(bool); // No implementation -> fail to link time if internally used.
您可以等待C++17,当Concepts可以在C++11中auto
的任何位置使用时,将您的签名写为:
void foo( IsActually<int*>::template test x ) { }
这实际上看起来很糟糕,但到那时他们可能会清理语法。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 编译器可以静默地从 const 转换为 const 和,反之亦然吗?
- 防止从false到指针的静默强制转换
- 如何获取视觉C++警告 int 到字符串的静默转换