标签:c operators casting visual-c
我有以下课程:
class MyClass {
public:
MyClass( char* what ) : controlled( what ) {}
~MyClass() { delete[] controlled; }
operator char*() const { return controlled; }
operator void*() const { return controlled; }
operator bool() const { return controlled != 0; }
private:
char* controlled;
};
这是使用具有以下typedef的Microsoft SDK进行编译的:
typedef long LONG_PTR;
typedef LONG_PTR LPARAM;
调用代码执行以下操作:
MyClass instance( new char[1000] );
LPARAM castResult = (LPARAM)instance;
// Then we send message intending to pass the address of the buffer inside MyClass
::SendMessage( window, message, wParam, castResult );
突然,castResult为1-调用MyClass :: operator bool(),它返回true并将其转换为1.因此,与其将地址传递给SendMessage()而不是将地址传递给1,这会导致未定义的行为.
但是,为什么首先要调用运算符bool()?
解决方法:
这是使用运算符bool的已知陷阱之一,这是C继承的余波.阅读有关Safe Bool Idiom的文章,绝对可以使您受益.
通常,您没有提供任何其他可匹配的强制转换运算符,并且bool(不幸的是)被视为算术强制转换的良好来源.
标签:c,operators,casting,visual-c 来源: https://codeday.me/bug/20191012/1899339.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。