#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 对象
google-cloud-platform - (Terraform) 左操作数 : a numbe
c++ - std::vector 和动态分配数组有什么区别?
reactjs - react 路线不工作 | react 路由器
c++ - 将字符数组 char u[10] 与字符串文字 "abc"进行比较是否是未定义的行为