我試圖通過此處列出的書籍來了解 C 中的多載決議。下面給出了我為清除我無法理解的輸出而撰寫的一個這樣的示例。
#include <iostream>
struct Name
{
operator int()
{
std::cout<<"Name's int version called"<<std::endl;
return 4;
}
operator float()
{
std::cout<<"Name's float version called"<<std::endl;
return 1.1f;
}
};
int main()
{
double a = Name(); //this works and calls Name's float version. But WHY ISN'T THIS AMBIGIOUS?
long double b = Name(); //this does not work. WHY IS THIS AMBIGIOUS?
bool c = Name(); //this does not work. WHY IS THIS AMBIGIOUS?
return 0;
}
正如您在此處看到的,該程式在創建double a. 但是當我嘗試創建物件時b,c它會出錯。
我的問題是:
為什么我們沒有得到 object 的歧義錯誤
a。也就是說,在 class的兩個轉換運算子Name中,為什么float選擇版本而不是int版本。我們為什么/如何得到物件的歧義錯誤,
b它是一個long double. 就像 for 一樣a,我懷疑float應該呼叫該版本,但我們得到了錯誤。這與上述double a情況有何不同。為什么/我們如何得到物件的歧義
c錯誤bool。在這種情況下,我懷疑int可能選擇了版本,但我們得到了一個錯誤。double a這與作業和使用float轉換功能版本的版本有何不同。
我只是想了解第一個版本為什么/如何作業,但其他兩個沒有。
uj5u.com熱心網友回復:
本質上,跳過一些在這種情況下不相關的東西,多載決策是為了選擇用戶定義的轉換函式來初始化變數,并且(因為轉換運算子之間沒有其他區別)基于將回傳值轉換為變數型別所需的標準轉換序列的等級。
該轉換int -> double是浮點整數轉換,它具有秩轉換。
轉換float -> double是浮點提升,有等級提升。
等級提升優于等級轉換,因此多載決議將選擇operator float作為最佳可行多載。
該轉換int -> long double也是浮點整數轉換。
轉換float -> long double不是浮點提升(僅適用于轉換)。相反,它是具有秩轉換的浮點轉換。float -> double
兩個序列現在具有相同的標準轉換序列等級,并且沒有任何決勝局(我不會經歷)適用,因此多載決議是模棱兩可的。
轉換int -> bool是具有等級轉換的布爾轉換。
該轉換float -> bool也是布爾轉換。
因此出現與上述相同的情況。
有關轉換類別和排名的完整串列,請參閱https://en.cppreference.com/w/cpp/language/overload_resolution#Ranking_of_implicit_conversion_sequences和https://en.cppreference.com/w/cpp/language/implicit_conversion。
雖然看起來浮點型別之間的轉換應該被認為比從整數到浮點型別的轉換“更好”,但通常情況并非如此。
uj5u.com熱心網友回復:
在這個初始化
double a = Name();
有使用浮點提升。
C 17 標準(7.7 浮點提升)
1 float 型別的純右值可以轉換為 double 型別的純右值。值不變。2 這種轉換稱為浮點提升
對于回傳型別物件的轉換函式, int使用的轉換的等級比浮點提升低。
也就是說,具有晉升等級的轉換功能比具有轉換等級的功能更可行。
在這些宣告中
long double b = Name();
bool c = Name();
使用了從 int 和 float 型別到 long double 和 bool 型別的轉換。因此,兩種轉換都不是更好。這兩個函式都有轉換等級。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/421208.html
標籤:
