[英]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条建议:
如果您想更好地理解转换规则 :
如果您想找到一些错误 :
或将您的代码分解为更小的步骤,例如
E e; auto i = static_cast<u32>(e); func(i);
static_cast<u32>(e)
使用显式类型的初始化器惯用语(请参阅Effective Modern C ++项目6)
如果要避免错误 ,则应避免过于复杂的隐式转换,并要警惕用户定义的转换功能( 更有效的C ++项目5)。 例如:
explicit A(u32 i){};
enum class E{...}
A(E enumElement){};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.