gpt4 book ai didi

c++ - 如何检查在 C++ 中使用了哪个构造函数

转载 作者:行者123 更新时间:2023-11-30 03:35:06 25 4
gpt4 key购买 nike

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

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

#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)
{
}

但是调用者通过传递一个枚举来调用它。

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 中显示。

问题:有什么方法可以防止enumunsigned 的gcc 自动转换?

答案:查看我选择的答案。 scoped enum 是在 C++11 中引入的,可以满足这个目的。您可以检查 EXPLICIT_ENUM_CONVERSION 中的代码。

最佳答案

根据您的目标,这里有 3 个建议:

如果您想更好地理解转换规则:

  1. 阅读书中的相关部分Accelerated C++ (偏好,转化步骤)
  2. 阅读书中的相关部分More Effective C++ (不超过 1 个隐式转换)
  3. 阅读C++ standard, e.g. the C++14 draft

如果你想发现一些错误:

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

    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){};

关于c++ - 如何检查在 C++ 中使用了哪个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41503479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com