1. 在两种情况下会产生二义性转换歧义:

1.1 A类定义了一个接受B类对象的转换构造函数,同时B类定义了一个转换目标是A类的类型转换运算符。

struct B;
struct A
{A() = default;A(const B&);    //把一个B转换为A
};struct B{operator A() const; //也是把B转换为A
}A f(const A& a) {return a;}B b;
A a = f(b);    //二义性错误,含义是 f(B::operator A()) 还是f(A::A(const B&)) ???

如果确实要执行上面的调用需要显示的调用:

A a1 = f(b.operator A());
A a2 = f(A(b));

1.2 类定义了多个类型转换规则,而这些转换涉及的类型本身可以通过其他类型转换联系在一起。

标为内置类型的多重类型转换

 struct A{//最好不要创建两个转换源都是算术类型的类型转换A(int  = 0);A(double);//最好不要创建两个转换对象都是算术类型的类型转换operator int() const;operator double() const;
};void f2(long double);
A a;
f2(a); //二义性错误,含义是 f(A::operator int()),还是f(A::operator double())long lg;
A a2(lg);   //二义性错误,含义是A::A(int) 还是 A::A(double)

上面的转换因为不存在最佳匹配,所以会造成二义性。

short s = 42;
A a3(s); //使用 A::A(int),因为short转换成int由于short转换成double

2. 设计原则

  • 不要为两个类定义相同的类型转换,也不要在类中定义两个及两个以上转换源或者转换目标是算术类型的转换。
  • 如果类中包含一个或多个类型转换,则必须保证在类类型和目标类型之间只存在唯一的一种转换方式,否则的话,有可能出现二义性。eg. 最典型的例子就是算术运算符。
  • 当我们使用两个用户定义的类型转换时,如果转换函数之前或者之后存在标准类型转换,则标准类型转换将决定最佳匹配到底是哪个
  • 除了显式向bool类型的转换为,应该尽量避免定义类型转换函数并尽可能地限制“显然正确”的非显式构造函数。

3. 重载函数与转换构造函数

struct C
{C(int);
};
struct D
{D(int);
};void manip(const C&);
void manip(const D&);
manip(10);  //二义性错误,含义是manip(C(10))还是manip(D(10))manip(C(10));   //正确,显示的指明调用
  • 如果在调用重载函数时,需要构造函数或者强制类型转换来改变实参类型,则这通常意味着程序设计存在不足。

4. 重载函数与用户定义的类型转换

在调用重载函数时,如果类型转换不止一个且彼此不同,则该调用具有二义性,即使其中一个调用需要额外的标准类型转换而另一个调用能精确匹配,编译器也会提示错误。

struct E
{E(double){}
};
manip(10);  //二义性错误,含义是manip(C(10))还是manip(E(10))

【引用】

[1] 代码classTypeExchange.h

C++ Primer 5th笔记(chap 14 重载运算和类型转换)二义性类型转换相关推荐

  1. C++ Primer 5th笔记(chap 14 重载运算和类型转换)递增和递减运算符

    并不要求递增和递减运算符一定是类的成员函数,但是因为这个运算符改变的正好是所操作的对象的状态,所以建议将它们设为成员函数. 为了和内置版本保持一致,前置运算符应该返回递增或递减后对象的引用. 为了和内 ...

  2. C++ Primer 5th笔记(chap 14 重载运算和类型转换)重载运算概述

    1. 定义 重载运算是具有特殊名字的函数,它们的名字由关键字operator和其后要定义的运算符号组成. 2. 运算符表 2.1 可重载运算符 运算符类型 运算符种类 双目算术运算符 + (加),-( ...

  3. C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数匹配与重载运算符

    如果一个类既提供了转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题. 如果a是一种类型,表达式 a sym b 可能是: //不能通过调用形式来区分当前 ...

  4. C++ Primer 5th笔记(chap 14 重载运算和类型转换)可调用对象与function

    1. 5种形式 可调用对象有5种形式,类型各不同: 形式 解释 函数 返回值类型和实参类型 函数指针 返回值类型和实参类型 lambda表达式 类类型 bind创建的对象 todo 重载了函数调用运算 ...

  5. C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象

    1. 定义 lambda是函数对象:编写一个lambda后,编译器会将该表达式转换成一个未命名类的未命名对象,类中含有一个重载的函数调用运算符. eg. stable_sort(words.begin ...

  6. C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数调用运算符

    1. 定义 如果类定义了调用运算符(重载了函数调用运算符),则该类的对象被称作函数对象(function object),可以像使用函数一样使用该类的对象, eg. struct absInt{int ...

  7. C++ Primer 5th笔记(chap 14 重载运算和类型转换)成员运算符

    成员运算符分为两种: 解引用运算符* 箭头运算符-> 设计准则 箭头运算符必须是类的成员. 解引用运算符通常也是类的成员,尽管并非必须如此. 重载的箭头运算符必须返回类的指针或者自定义了箭头运算 ...

  8. C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符

    运算符 双目算术运算符 + (加),-(减),*(乘),/(除),% (取模) 关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),> ...

  9. C++ Primer 5th笔记(chap 14 重载运算和类型转换)类类型转换

    1. 定义 类型转换运算符:(既然一个类类型可以由实参类型对象隐式转换而来,那么)一个类类型的值也可以转换成其它类型 形式 : operator type() const type 表示某种类型,类型 ...

最新文章

  1. 卧槽,又一个Java面试神器!!!
  2. H5实例教学--微信内嵌视频1(案例浅析)
  3. Laravel 怎么在 blade 视图中将带 HTML 字符原样输出
  4. DCMTK:测试VR类的compare()运算符
  5. Spring Cloud Config服务端配置细节(一)
  6. Linux的Application 内存模型---
  7. 如何查看文件的字符集
  8. C++ int与string的相互转换
  9. mysql配置文件参数详解 my.cnf
  10. 「leetcode」142.环形链表II,如何求环?如何找入口?各个细节讲的明明白白!你疑惑的地方,这里都有!
  11. Linux系统-Ubuntu的下载和安装
  12. php代码的网页框架,easyweb: easyweb是一个简单易用的php框架,实现了路由、容错等处理,集成composer代码生态,可快速创建中小型网站应用...
  13. TOOLFK工具-在线二维码解码工具
  14. LVDS的接口电路设计
  15. fpga运算服务器_当FPGA也成为一种服务,你还在顾虑什么?
  16. 线特征作为视觉描述:用于视觉定位的上下文感知线特征描述符
  17. Caché——高性能对象关系型数据库
  18. android 实现磨砂效果_Android(Android5.0)下毛玻璃(磨砂)效果如何实现?
  19. 红旗linux 操作系统,红旗Linux操作系统9.0官方下载-红旗Linux操作系统9.0正式版(基于c语言)免费版 - 维维软件园...
  20. 142.如何个性化推荐系统设计-2

热门文章

  1. Android --- 微信支付时出现错误:错误的签名,验签失败,return_code=FAIL
  2. Computer:路由器、交换机、猫Modem的简介、区别之详细攻略
  3. 成功解决bash syntax error near unexpected token from
  4. DayDayUp:《机器崛起前传》第二十二章【蹒跚而来】读后感(文章源自网络)—听课笔记
  5. 成功解决ValueError: attempted relative import beyond top-level package
  6. 成功解决cv2.imwrite(filename, img)代码输出中文文件乱码的问题(cv2.imencode方法解决)
  7. ML之Clustering:关于Clustering进阶的那些不可告密的事
  8. Crawler:基于requests库+json库+40行代码实现爬取猫眼榜单TOP100榜电影名称主要信息
  9. 一文弄懂神经网络中的反向传播法
  10. linux系统如何进行录屏