[英]How to solve ambiguity between conversion constructor and normal constructor?
我期待消除普通構造函數和自動轉換構造函數之間的歧義。
據我所知,可以通過將普通構造函數聲明為explicit
來部分消除這種歧義,因此編譯器將避免像下面這樣使用該構造函數作為轉換構造函數:
#include <iostream>
#include <fstream>
class Integer{
int i ;
public:
explicit Integer (const int _i) : i(_i) {} //Normal constructor
Integer (const int& ii ) : i (ii) {} // conversion constructor
operator int() {return int (i) ;} // Auto-conversion operator
friend std::ostream & operator <<(std::ostream &os, const Integer io ) {
std::cout << io.i ;
return os ;
}
};
int main() {
// Integer io (5); call of overloaded ‘Integer(int)’ is ambiguous error
Integer io2 = 20 ; // conversion constructor
std:: cout << io2 << "\n" ;
int i = io2 ; // auto-conversion operator
std:: cout << i << "\n" ;
}
輸出:
20
20
我的問題是:
1-是否存在強制使用構造函數作為轉換構造函數的標准方法?
2-使用轉換構造函數和自動轉換運算符是一種好習慣,換句話說,如果正常構造函數不被轉換構造函數重載,我是否可以確保不同的編譯器將構造函數用作轉換構造函數?
謝謝啦
有沒有一種強制將構造函數用作轉換構造函數的標准方法,因為有一種強制將其用作普通構造函數的標准方法嗎?
是的,您省略了explicit
關鍵字。
使用轉換構造函數和自動轉換運算符是一個好習慣嗎,換句話說,如果普通構造函數沒有被轉換構造函數重載,我是否可以確保不同的編譯器將構造函數用作轉換構造函數?
如果編譯器符合標准,則這里沒有問題。 隱式構造沒有錯。 當您構造對象等的文字數組時,它們可以非常方便。 也可能令人驚訝。 用你的判斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.