c++ 为什么声明一个`operator bool()const`成员会重载[]操作符?[副本]

smdnsysy  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(231)

此问题已在此处有答案

Why is "operator bool()" getting called if a class object needs conversion to int in C++?(4个答案)
Why can you add an integer to a string literal?(1个答案)
c++ interesting syntax for printing new line in std::cout [duplicate](1个答案)
20小时前关闭。
为什么这段代码可以编译?因为没有声明operator[],所以我认为它会失败。operator[]的定义从何而来?

struct Test {
    operator bool() const {
        return true;
    }
};

int main(int argc, char** argv) {
    Test test;

    if (test["wut"])
        cout << "Success (test[\"wut\"])\n";
}
euoag5mw

euoag5mw1#

该运算符来自内置的下标运算符,它将表达式A[B]视为*(A + B)
在这些情况下,test通过operator bool()方法隐式转换为整数类型的值01(所有这些情况下都是1)。
这导致*(1 + "wut") =〉'u'的求值,然后导致if条件通过,因为'u'是非零值。同样,以下条件也会传递if ("wut"[test]),因为它解析为"wut"[1] =〉*("wut" + 1) =〉*("ut") =〉'u'
将您的成员声明为explicit operator bool(),以防止您的类型被隐式转换为其他整型。

相关问题