我想質疑伴隨隱式型別轉換的多載決議。這個問題是指 cppreference 1和2。
似乎隱式轉換序列最多需要三個步驟將型別T1(引數型別)轉換為T2(引數型別):
- 零個或一個標準轉換序列;
零個或一個用戶定義的轉換;(我想忽略這一步,因為它與這個問題無關。)- 零個或一個標準轉換序列。
隱式轉換序列可以歸類為以下之一:
- 標準轉換序列(我只對這種基本型別轉換案例感興趣。)
用戶定義的轉換序列省略號轉換序列
并且,每種型別的標準轉換序列都被分配了三個等級之一:
- 完全匹配:無需轉換、左值到右值轉換、限定轉換、函式指標轉換、型別別到同一類的用戶定義轉換
- 提升:積分提升、浮點提升
- 轉換:整數轉換、浮點轉換、浮點整數轉換、指標轉換、指標到成員轉換、布爾轉換、派生類到其基類的用戶定義轉換
和,
標準轉換序列的等級是它所擁有的標準轉換等級中最差的。
我認為會有這樣一種情況,即兩個隱式轉換序列的組成標準轉換序列步驟彼此具有不同的等級。因此,恕我直言,我很難確定哪個隱式轉換序列比另一個更受歡迎。
例如(不幸的是,我無法想出一個具體的例子。),
隱式轉換序列 ( A ) 包括
- 標準轉換序列 ( A-1 ),即等級提升。
- 沒有用戶定義的轉換序列
- 標準轉換序列(A-2),即等級轉換。
另一個隱式轉換序列 ( B ) 包括
- 標準轉換序列(B-1),即等級轉換。
- 沒有用戶定義的轉換序列
- 標準轉換序列(B-2),即等級提升。
在這種情況下,A-1比B-1 好,但B-2比A-2 好。因此,A和B 中的每一個都有自己的偏好。-> 模棱兩可的電話?
或... A-1和B-1應該首先比較A-2和B-2。那么,我們應該停止在這里進行貪婪的比較嗎?-> A被選中了?
更新:解釋我對這些概念的理解......
// [ what is overall rank for standard coversion sequence n ]
// [ standard conversion sequence n(up to 2) ]
// [ each conversion's rank in a std conv sequence n ]
// [ what conversions are performed in a std conv sequence n ]
// [ how source type T1 is converted to target type T2 ]
// [ promotion ][ exact match ]
// [ std conv seq1 ][ std conv seq2 ]
// [ promotion | exact match ][ exact match ]
// [ promotion | const qualification ][ no conversion ]
// [char -> int -> const int -> const int ]
void f(const int){
std::cout << "f(const int)" << std::endl;
}
// [ promotion ][ conversion ]
// [ std conv seq1 ][ std conv seq2 ]
// [ promotion || conversion | exact match ]
// [ promotion || integral conversion, const qualification ]
// [char -> int -> long -> const long ]
void f(const long){
std::cout << "f(const long)" << std::endl;
}
int main() {
// For the first sequence, the two functions have same 2nd rank, 'promotion'.
// So, we couldn't determine which function will be called yet.
// But, for the second sequence, the former has 1st rank 'exact match'
// and the latter has 3rd rank 'conversion'. So the former will be called.
f('c'); // prints "f(const int)"
}
uj5u.com熱心網友回復:
Cppreference 是一個有用的參考站點,但它不是 C 標準。它具有大部分準確的資訊,但在簡化標準的復雜性時,可能會在邊緣附近丟失一些細節。
我將參考 C 17(因為我沒有可以鏈接到的 C 11 網站),但措辭沒有有意義的改變。
[over.best.ics]/3將隱式轉換序列定義為:
格式良好的隱式轉換序列是以下形式之一:
- 一個標準的轉換序列,
- 用戶定義的轉換序列,或
- 省略號轉換序列。
這或多或少是 Cppreference 所說的,但這里更明確地表明您要么擁有一個標準轉換序列,要么擁有一個用戶定義的轉換。用戶定義的轉換本身 包括兩個標準的轉換序列:
用戶定義的轉換序列由初始標準轉換序列后跟用戶定義的轉換 ([class.conv]) 和第二個標準轉換序列組成。
Cppreference 使您看起來可以在沒有用戶定義轉換的情況下擁有兩個標準轉換序列,但您不能。如果游戲中沒有用戶定義的轉換,則您只有一種標準轉換。
不要試圖將 Cppreference 視為 C 的合法定義。將其更多地視為“C 的作業方式主要是這樣”。如果您需要合法的細節(并且在大多數情況下,您不需要。尤其是在多載決議方面。對此了解太多會使您成為一個糟糕的程式員),那么您必須遵循標準。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/364339.html
