C++ Primer 5th笔记(chap 14 重载运算和类型转换)二义性类型转换
生活随笔
收集整理的這篇文章主要介紹了
C++ Primer 5th笔记(chap 14 重载运算和类型转换)二义性类型转换
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 在兩種情況下會產(chǎn)生二義性轉換歧義:
1.1 A類定義了一個接受B類對象的轉換構造函數(shù),同時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&)) ???如果確實要執(zhí)行上面的調(diào)用需要顯示的調(diào)用:
A a1 = f(b.operator A()); A a2 = f(A(b));1.2 類定義了多個類型轉換規(guī)則,而這些轉換涉及的類型本身可以通過其他類型轉換聯(lián)系在一起。
標為內(nèi)置類型的多重類型轉換
struct A{//最好不要創(chuàng)建兩個轉換源都是算術類型的類型轉換A(int = 0);A(double);//最好不要創(chuàng)建兩個轉換對象都是算術類型的類型轉換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轉換成double2. 設計原則
- 不要為兩個類定義相同的類型轉換,也不要在類中定義兩個及兩個以上轉換源或者轉換目標是算術類型的轉換。
- 如果類中包含一個或多個類型轉換,則必須保證在類類型和目標類型之間只存在唯一的一種轉換方式,否則的話,有可能出現(xiàn)二義性。eg. 最典型的例子就是算術運算符。
- 當我們使用兩個用戶定義的類型轉換時,如果轉換函數(shù)之前或者之后存在標準類型轉換,則標準類型轉換將決定最佳匹配到底是哪個
- 除了顯式向bool類型的轉換為,應該盡量避免定義類型轉換函數(shù)并盡可能地限制“顯然正確”的非顯式構造函數(shù)。
3. 重載函數(shù)與轉換構造函數(shù)
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)); //正確,顯示的指明調(diào)用- 如果在調(diào)用重載函數(shù)時,需要構造函數(shù)或者強制類型轉換來改變實參類型,則這通常意味著程序設計存在不足。
4. 重載函數(shù)與用戶定義的類型轉換
在調(diào)用重載函數(shù)時,如果類型轉換不止一個且彼此不同,則該調(diào)用具有二義性,即使其中一個調(diào)用需要額外的標準類型轉換而另一個調(diào)用能精確匹配,編譯器也會提示錯誤。
struct E {E(double){} }; manip(10); //二義性錯誤,含義是manip(C(10))還是manip(E(10))【引用】
[1] 代碼classTypeExchange.h
總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 14 重载运算和类型转换)二义性类型转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha