【问题标题】:Why does operator char*() override operator bool() const in boolean context?为什么 operator char*() 在布尔上下文中覆盖 operator bool() const?
【发布时间】:2014-04-29 05:49:12
【问题描述】:

似乎在纯布尔上下文中的 c++ 中,operator char*() 的优先级高于 operator bool() const;并启用 c++11 模式并使用 explicit operator bool() const 无济于事。这是 g++ 中的错误还是语言标准中的错误?或者我没有看到这种疯狂的行为有充分的理由吗?

问题的简单演示:

#include <stdio.h>

struct A
{
    char buf[512];
    int err;

    operator char* () { return buf; }
    operator const char* () const { return buf; }
    operator bool () const { return !err; }
    // explicit operator bool () const { return !err; } // same problem
};

int main()
{
    A a;
    a.err = -42;
    if (a) {
        printf("lolwut?\n");
        return 1;
    }
    return 0;
}

【问题讨论】:

  • 这可能是由于const。您是否尝试添加operator bool() { return !err}
  • 是的,添加一个非常量版本的operator bool() 是一种解决方案,但感觉就像是丑陋且不必要的代码重复(尤其是因为在我的真实代码中,检查并不像@那么简单987654329@:)
  • 有一些方法可以避免const 和非const 方法之间的代码重复。
  • explicit operator char 怎么样?毕竟,您可以明确地进行所有转换。

标签: c++ operator-overloading


【解决方案1】:

正如@oakad 所解释的那样——优雅的解决方案是在 c++11 模式下使用explicit operator char*()。这将确保 operator char*() 不会在布尔上下文中使用。

正如explained by @bolov — 观察到的行为是语言标准的一部分。根据 13.3.1,为了解决重载函数的目的,方法被认为具有隐式对象参数。对于没有 ref-qualifier 声明的方法,此参数是对具有相应 cv-qualifier 的类的引用。

所以我们实际上有以下情况:

char* op(A& a) { return a.buf; }
bool op(const A& a) { return !a.err; }

由于amain() 中不是const,因此选择了非const 运算符。我们是否有 operator char*()operator int()operator double() 无关紧要 - 可以在布尔上下文中使用的非 const 转换运算符将具有比 operator bool() const 更高的优先级。

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2013-11-14
    • 2013-04-24
    相关资源
    最近更新 更多