gpt4 book ai didi

c++ - 为什么 operator char*() 在 bool 上下文中覆盖 operator bool() const?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:17:36 25 4
gpt4 key购买 nike

似乎在 c++ 中,在纯 bool 上下文中,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;
}

最佳答案

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

作为explained by @bolov — 观察到的行为是语言标准的一部分。根据 13.3.1,为了解析重载函数,方法被认为具有隐式对象参数。对于未使用 ref 限定符声明的方法,此参数是对具有相应 cv 限定符的类的引用。

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

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 可在 bool 上下文中使用的强制转换运算符的优先级高于 operator bool() const

关于c++ - 为什么 operator char*() 在 bool 上下文中覆盖 operator bool() const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23356491/

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