簡體   English   中英

如何檢查C ++中使用了哪個構造函數

[英]How to check which constructor is used in C++

我在這里修改了問題。 現在看起來像一個答案,:)。 謝謝大家解決這個問題。

我的課上有一些重載的構造函數,像這樣

#include <string>

#ifdef EXPLICIT_ENUM_CONVERSION
enum struct E
#else
enum E
#endif
{
    A,
    B
};

class A
{
public:
  A(unsigned int i){};
  A(std::string const& s){};
};

以及實際上接受A作為參數的函數聲明

void func(const class A& a)
{
}

但是調用者通過傳遞enum來調用它。

int main()    
{
#ifdef EXPLICIT_ENUM_CONVERSION
  E e=E::A;
  func((unsigned int)e);  
#else
  E e=A;
  func(e);  
#endif
}

問題:通過注釋掉A(unsigned)並再次編譯以獲取錯誤,我可以知道所使用的構造函數。 但是,有沒有更好的方法來說明如何從gcc命令行或objdump結果轉換類型呢?

答案:如果使用-O0進行編譯,然后使用objdump -CSr,則會從objdump中顯示所使用的類構造函數。

問題:有什么方法可以防止用gcc將enum轉換為unsigned自動轉換?

答:請參閱我選擇的答案。 范圍枚舉是在C ++ 11中引入的,可以滿足目的。 您可以在EXPLICIT_ENUM_CONVERSION中檢查代碼。

根據您的目標,這里有3條建議:

如果您想更好地理解轉換規則

  1. 閱讀《 加速的C ++ 》一書中的相關部分(首選項,轉換步驟)
  2. 閱讀《 更有效的C ++ 》一書中的相關部分(不超過1個隱式轉換)
  3. 閱讀C ++標准,例如C ++ 14草案

如果您想找到一些錯誤

  • 使用printf調試或登錄ctor
  • 或使用調試器
  • 或將您的代碼分解為更小的步驟,例如

     E e; auto i = static_cast<u32>(e); func(i); 

    static_cast<u32>(e)使用顯式類型的初始化器慣用語(請參閱Effective Modern C ++項目6)

如果要避免錯誤 ,則應避免過於復雜的隱式轉換,並要警惕用戶定義的轉換功能( 更有效的C ++項目5)。 例如:

  • 顯式轉換ctor: explicit A(u32 i){};
  • 范圍枚舉: enum class E{...}
  • 作用域枚舉作為ctor參數: A(E enumElement){};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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