gpt4 book ai didi

c++ - 在 C++ 中重载运算符时,为什么 T* 优于 bool?

转载 作者:行者123 更新时间:2023-12-02 20:11:06 30 4
gpt4 key购买 nike

我有一个包装类,其行为应类似于指针。我已经重载了operator T*operator bool。 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;
}

PS:我也尝试过使用 !!(bool),但它仍然调用 operator int*()。对于operator bool(),我必须显式调用它。

最佳答案

在类定义中,转换运算符 operator bool 使用限定符 const 进行声明,但 if 语句中使用的对象不是常量对象。

operator bool() const
^^^^^
{
printf("operator bool()\n");
return m;
}

删除限定符const,运算符operator bool将被调用。

或者声明转换运算符operator int * 就像

operator const int* () const
{
printf("operator int* ()\n");
return &m;
}

操作符operator bool将再次被调用。

当运算符具有限定符 const 并应用于非常量对象时,则需要再进行一次转换,即限定转换。

此外,您甚至可以将运算符声明为显式的。例如

explicit operator bool() 
{
printf("operator bool()\n");
return m;
}

关于c++ - 在 C++ 中重载运算符时,为什么 T* 优于 bool?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58747470/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com