關于我最近的答案“ 在C ++中還可以使用其他有用的強制轉換”的幾點評論表明,我對C ++轉換的理解是錯誤的。為了澄清問題,請考慮以下代碼:#include <string>struct A { A( const std::string & s ) {}};void func( const A & a ) {}int main() { func( "one" ); // error func( A("two") ); // ok func( std::string("three") ); // ok}我的斷言是,第一個函數調用是一個錯誤,因為沒有從const char *到A的轉換。從字符串到A的轉換,但是使用此轉換將涉及多個轉換。我的理解是不允許這樣做,這似乎已由g ++ 4.4.0和Comeau編譯器確認。使用Comeau時,出現以下錯誤:"ComeauTest.c", line 11: error: no suitable constructor exists to convert from "const char [4]" to "A" func( "one" ); // error如果您可以在此處或原始答案中指出我錯了,最好參考C ++標準,請這樣做。C ++標準的答案似乎是:最多將一個用戶定義的轉換(構造函數或轉換函數)隱式應用于單個值。感謝Abhay提供報價。
3 回答

莫回無
TA貢獻1865條經驗 獲得超7個贊
我認為Sharptooth的答案很準確。標題為“轉換”的C ++標準(SC22-N-4411.pdf)第12.3.4節明確規定,僅允許進行一次隱式的用戶定義轉換。
1類對象的類型轉換可以由構造函數和轉換函數指定。這些轉換稱為用戶定義的轉換,用于隱式類型轉換(第4章),初始化(8.5)和顯式類型轉換(5.4、5.2.9)。
2用戶定義的轉換僅適用于明確的轉換(10.2,12.3.2)。轉換遵守訪問控制規則(第11條)。歧義解決后將應用訪問控制(3.4)。
3 [注意:有關在函數調用中使用轉換的討論以及下面的示例,請參見13.3。—尾注]
4最多將一個用戶定義的轉換(構造函數或轉換函數)隱式應用于單個值。

慕田峪9158850
TA貢獻1794條經驗 獲得超7個贊
C ++編程語言(第4版)(第18.4.3節)說:
只有一個級別的用戶定義的隱式轉換是合法的
該“用戶定義的”部分聽起來似乎是允許的,如果某些隱式轉換位于本機類型之間,則可以允許進行多次隱式轉換。
- 3 回答
- 0 關注
- 661 瀏覽
添加回答
舉報
0/150
提交
取消