Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么C++表达式会涉及重载运算符和隐式转换?

为什么C++表达式会涉及重载运算符和隐式转换?

提问于 2018-01-29 15:57:25
回答 2关注 0查看 622

有谁能解释一下为什么boolif (a < 0)表达式可以作为特定的运算符,是否有解决办法?

代码语言:txt
AI代码解释
复制
struct Foo {
    Foo() {}
    Foo(int x) {}

    operator bool() const { return false; }

    friend bool operator<(const Foo& a, const Foo& b) {
        return true;
    }
};

int main() {
    Foo a, b;
    if (a < 0) {
        a = 0;
    }
    return 1;
}

当编译时,得到:

代码语言:txt
AI代码解释
复制
g++ foo.cpp
foo.cpp: In function 'int main()':
foo.cpp:18:11: error: ambiguous overload for 'operator<' (operand types are 'Foo' and 'int')
     if (a < 0) {
           ^
foo.cpp:18:11: note: candidate: operator<(int, int) <built-in>
foo.cpp:8:17: note: candidate: bool operator<(const Foo&, const Foo&)
     friend bool operator<(const Foo& a, const Foo& b)

午夜的船长

发布于 2018-01-30 00:59:19

这里的问题是C++有两个选项要处理a < 0表达:

  • 转换abool,并将结果与0内建操作符<(一次改划)
  • 转换0Foo,并将结果与<定义的(一个转换)

可以通过删除第二种情况下的转换来显式地实现这一点:

代码语言:txt
AI代码解释
复制
if (a < Foo(0)) {
    ...
}
查看全部 2 条回答
相关文章
+号运算符涉及的隐式转换
+号运算符,会根据两边的类型不同,而进行不同的隐式转换。本文主要给大家介绍,当+号两边的类型不同时,到底会如何进行隐式转换
用户9914333
2022/07/21
4660
+号运算符涉及的隐式转换
mysql 隐式转换_js强制转换和隐式转换
什么鬼,明明查的是204027026112927603,为什么204027026112927605也出来了
全栈程序员站长
2022/11/07
5.2K0
mysql 隐式转换_js强制转换和隐式转换
C++ 隐式类型转换
C++定义了一组内置类型对象之间的转换标准,在必要的时候它们被编译器隐式的转换 1、任何两种或多种类型的数据和变量混合操作的时候,最宽的数据类型成为目标转换类型(常量和变量都会被改变) 2、不同类型的表达式之间赋值的时候,被赋值的对象类型成为目标转换类型 3、函数调用实参和形参类型不一致的时候,形参的对象类型成为目标转换类型 4、函数的返回值类型和函数表达式的类型不一样的时候,函数表达式的类型成为目标转换类型 注意:算术运算中两个通用的的指导准则如下 (1)为了防止精度损失,类型总是被提升为较宽的类型。 (
用户1215536
2018/02/05
1.3K0
sql的隐式转换_js强制转换和隐式转换
Oracle中对不同类型的处理具有显式类型转换(Explicit)和隐式类型转换(Implicit)两种方式,对于显式类型转换,我们是可控的,但是对于隐式类型转换,当然不建议使用, 因为很难控制,有不少缺点,但是我们很难避免碰到隐式类型转换,如果不了解隐式类型转换的规则,那么往往会改变我们SQL的执行计划,从而可能导致效率降低或其它问题。
全栈程序员站长
2022/11/07
3.3K0
oracle隐式转换和显式转换_oracle显示游标和隐式
和其他的关系型数据库一样, oracle 中也能进行一些隐式的数据转换,这对我们写 SQL 语句有 非常 用,我们可以不必麻烦地手动转化很多类型的字符。虽然前面我们介绍了一些使用例如to_char,to_date的函数进行强制转换的方法,但是隐式转换也还是不错的。 Orac
全栈程序员站长
2022/11/10
1.2K0
c++禁止隐式转换_无法将int隐式转换为类
那么如何阻止它呢? C++ 标准有一条规定: “Implicit conversions will be performed […] if the parameter type contains no template-parameters that participate in template argument deduction” (ISO/IEC 14882:1998, section 14.8.1.4). 也就是说,既在模板参数列表中,又在函数参数列表中的类型不会隐式转换。也就是:
全栈程序员站长
2022/11/10
1.4K0
javascript 隐式转换_mysql隐式转换
简单数据类型(也称为原始类型):Undefined、Null、Boolean、Number、String 和 Symbol。ES6 中新增了一种 Symbol 。这种类型的对象永不相等,即始创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。 复杂数据类型叫 Object(对象)。Object 是一种无序名值对的集合。
全栈程序员站长
2022/11/07
1.7K0
javascript 隐式转换_mysql隐式转换
C++ 隐式类类型转换
“可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”
Tencent JCoder
2022/05/06
7320
C++ 隐式类类型转换
C++运算符重载和函数重载
所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。
嵌入式视觉
2022/09/05
8530
C++核心准则:C.164:避免隐式转换运算符
Implicit conversions can be essential (e.g., double to int) but often cause surprises (e.g., String to C-style string).
面向对象思考
2020/03/25
4970
C# 隐式转换_php隐式转换
预定义的隐式转换总会成功而且不会引发异常,适当合理的用户自定义隐式转换也可以展示出这些 特性。
全栈程序员站长
2022/09/27
1.5K0
JS隐式转换_隐式转换是什么
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
2.1K0
C++ 重载运算符和重载函数
C++ 允许在同一作用域中的某个函数 和运算符 指定多个定义,分别称为函数重载 和运算符重载。
爱学iOS的小麦子
2023/05/05
8300
C++ 重载运算符和重载函数
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。
狼啸风云
2020/10/28
2.2K0
scala快速入门系列【隐式转换和隐式参数】
本篇作为scala快速入门系列的第三十七篇博客,为大家带来的是关于隐式转换和隐式参数的内容。
大数据梦想家
2021/01/26
9980
scala快速入门系列【隐式转换和隐式参数】
mysql 隐式类型转换_scala的隐式转换
在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引。下面分析两种隐式转换的情况
全栈程序员站长
2022/11/07
2.2K0
mysql 隐式类型转换_scala的隐式转换
从零开始学C++之运算符重载(四):类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete
该文摘要总结
s1mba
2017/12/28
7480
从零开始学C++之运算符重载(四):类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete
C++学习之路——函数重载和运算符重载
C++允许在同一作用域中的某个函数和运算符指定多个定义,分 别称为函数重载和运算符重载
全栈程序员站长
2022/09/23
4840
C++学习之路——函数重载和运算符重载
php隐式转换,隐式转换如何使用?总结隐式转换实例用法「建议收藏」
JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object。object是引用类型,其它的五种是基本类型或者是原始类型。我们可以用typeof方法打印来某个是属于哪个类型的。不同类型的变量比较要先转类型,叫做类型转换,类型转换也叫隐式转换。隐式转换通常发生在运算符加减乘除,等于,还有小于,大于等。。typeof ’11’ //string
全栈程序员站长
2022/11/10
1.8K0
php隐式转换,隐式转换如何使用?总结隐式转换实例用法「建议收藏」
spark隐式转换 toDf_隐式转换是什么
解决方案就是自己定义一个隐式转换函数,double2int。这个隐士函数的功能也需要是唯一的
全栈程序员站长
2022/11/10
1.2K0
spark隐式转换 toDf_隐式转换是什么

相似问题

C#接口。隐式实现与显式实现?

2418

如何用重载和重载方法解释这种行为?

2176

为什么会提示二进列运算符中有非数值参数?

16K

numpy的ndarray的子类,如果运算符重载赋值语句?

0299

为什么c++中数组定义的位置会引发错误?

1145
相关问答用户
某公司 | 程序员擅长1个领域
腾讯云TDP | 先锋会员擅长2个领域
新浪微博 | 高级总监擅长4个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档