簡體   English   中英

如何解決轉換構造函數和普通構造函數之間的歧義?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM