我在这里修改了这个问题。现在它看起来像一个答案,:)。谢谢大家解决这个问题。
我的课程中有一些重载的构造函数,像这样
#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中查看代码。
答案 0 :(得分:2)
根据您的目标,以下是3条建议:
如果您想更好地了解转化规则:
如果您想发现一些错误:
或将您的代码分解为更小的步骤,例如
E e;
auto i = static_cast<u32>(e);
func(i);
static_cast<u32>(e)
使用明确类型化的初始值设定项(见Effective Modern C++第6项)
如果您想避免错误,则应避免过于复杂的隐式转换,并对用户定义的转换函数保持警惕(More Effective C++第5项)。例如:
explicit A(u32 i){};
enum class E{...}
A(E enumElement){};