c++ - 指针类型运算符 VS const bool 运算符优先级

#include <cstdint>
#include <iostream>

struct a_struct {
    int64_t* le_int;
    bool not_ok;

    a_struct() : le_int{ new int64_t(0) }, not_ok{ false } {}
    ~a_struct() { delete le_int; }

    operator bool() const {
        return !not_ok;
    }

    operator int64_t* () {
        return le_int;
    }
};

int main(int argc, char** argv) {

    a_struct s;
    s.not_ok = true;
    if (!s)//<-
        std::cout << "o no." << std::endl;

    else if (s.not_ok)
        std::cout << "waddu heck?" << std::endl;

    return 0;
}

在此示例中,!s 分辨率优先于 int64_t*() 运算符,而不是 const bool() 运算符。

为什么?

最佳答案

这是重载决议的“通过转换函数初始化”案例:http://eel.is/c++draft/over.match.conv

这两个转换函数都是候选函数,因为它们都是非显式的,并且它们的返回类型可以隐式转换为 bool。然后以对象表达式 s 作为参数,并将转换函数的隐含对象参数作为参数来执行重载解析。隐含对象参数的类型为 T cv &,其中 T 是类。

T& 绑定(bind)到 T 比将 T const& 绑定(bind)到 T 更好。这是对隐式转换序列进行排名的规则之一。 http://eel.is/c++draft/over.ics.rank#3.2.6

请注意,有一个涉及转换函数返回类型的决胜规则。由于每个参数的隐式转换序列既不比另一个功能。因此,只有当两个转换函数具有相同的 cv 限定(导致隐含对象参数的相同隐式转换序列)时,才会达到决胜局。 http://eel.is/c++draft/over.match.best#general-2.2

https://stackoverflow.com/questions/71243379/

相关文章:

php - 如何使用 htaccess 将 URL 中的下划线替换为破折号?

android - 如何在撰写的TextField中用逗号格式化数字

javascript - 如何将 DynamoDB JSON 转换为常规 Javascript 对象

r - 如何获取下划线分隔的元素个数

google-cloud-platform - (Terraform) 左操作数 : a numbe

c++ - std::vector 和动态分配数组有什么区别?

reactjs - react 路线不工作 | react 路由器

c++ - 将字符数组 char u[10] 与字符串文字 "abc"进行比较是否是未定义的行为

python - 如何修复 python `dlib` 错误 : "symbol not found

reactjs - Next Redux Wrapper 中的水合物作用是什么?