Rad*_*u C 6 c++ class operator-overloading conversion-operator implicit-conversion
我有一个包装器类,其行为应类似于指针。我已经过载operator T*和operator bool。布尔进行了一些额外的验证。我尝试在if中使用该对象,但我注意到该operator T*对象称为和bool。有人可以解释我为什么吗?是在标准中以某种方式指定的吗?我在MSVC,clang和gcc中测试了以下示例代码,它们都调用operator T*。另外,根据我在此页面上阅读的内容(https://en.cppreference.com/w/cpp/language/implicit_conversion),if应该尝试转换为bool。
#include <stdio.h>
class MyClass
{
public:
MyClass(int i)
: m(i)
{}
operator bool() const
{
printf("operator bool()\n");
return m;
}
operator int* ()
{
printf("operator int* ()\n");
return &m;
}
private:
int m;
};
int main()
{
MyClass a(5);
MyClass b(0);
if (a)
printf("a is true\n");
else
printf("a is false\n");
if (b)
printf("b is true\n");
else
printf("b is false\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
PS:我也尝试过!!和(bool),但它仍然调用operator int*()。对于operator bool(),我必须明确地调用它。
在您的类定义中,operator bool使用限定符声明转换运算符,const但if语句中使用的对象不是常量对象。
operator bool() const
^^^^^
{
printf("operator bool()\n");
return m;
}
Run Code Online (Sandbox Code Playgroud)
删除限定符const,operator bool将呼叫操作员。
或者operator int *像这样声明转换运算符
operator const int* () const
{
printf("operator int* ()\n");
return &m;
}
Run Code Online (Sandbox Code Playgroud)
然后将再次operator bool呼叫操作员。
当运算符具有限定符const并应用于非常数对象时,则需要再进行一次转换,即限定条件转换。
此外,您甚至可以声明运算符为显式的。例如
explicit operator bool()
{
printf("operator bool()\n");
return m;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |