如何检查在C ++中使用的构造函数

时间:2017-01-06 10:17:53

标签: c++ gcc

我在这里修改了这个问题。现在它看起来像一个答案,:)。谢谢大家解决这个问题。

我的课程中有一些重载的构造函数,像这样

#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自动转换enumunsigned

答案:看看我选择的答案。带有范围的枚举是在C ++ 11中引入的,可以满足目的。您可以在EXPLICIT_ENUM_CONVERSION中查看代码。

1 个答案:

答案 0 :(得分:2)

根据您的目标,以下是3条建议:

如果您想更好地了解转化规则

  1. 阅读书籍Accelerated C++中的相关部分(偏好,转换步骤)
  2. 阅读书籍More Effective C++中的相关部分(不超过1次隐式转换)
  3. 阅读C++ standard, e.g. the C++14 draft
  4. 如果您想发现一些错误

    • 使用printf-debugging或登录你的ctors
    • 或使用调试器
    • 或将您的代码分解为更小的步骤,例如

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

      static_cast<u32>(e)使用明确类型化的初始值设定项(见Effective Modern C++第6项)

    如果您想避免错误,则应避免过于复杂的隐式转换,并对用户定义的转换函数保持警惕(More Effective C++第5项)。例如:

    • 显式转换ctor:explicit A(u32 i){};
    • 范围枚举:enum class E{...}
    • 将enum作为ctor参数:A(E enumElement){};