c++ - 自动判断用户自定义函数是否等同于隐式函数

标签 c++ c++11

有时,用户实现的功能与其隐式定义的版本具有等效的功能。例如,一个复制构造函数只调用其所有成员的复制构造函数。

struct A
{
    int B;
    A(const A& a) : B(a.B) { }
}

这是不可取的,因为它会导致额外的维护,例如,如果类成员被重命名/重新排序等,并且会降低可读性。此外,添加这些函数还意味着诸如 std::is_trivially_copy_constructable 之类的函数声称该类型不能平凡复制构造(但实际上,它实际上可以)。

我有一个代码库,其中这似乎是一个常见的事件,我想通过删除这些实现来纠正它。但是,我对删除似乎与隐式实现相同的功能感到不安,以防它实际上可能不等同。有没有一种方法可以确定一个函数是否等同于它的隐式版本? (使用任何工具集/语言变体/等都是可以接受的)。

最佳答案

我的建议是不要尝试以编程方式确定这些函数是否与默认实现相同,因为差异实际上可能是一个错误(并且它们应该具有正常的默认行为) .

相反,我只是建议编写一组单元测试,负责测试各种函数的预期行为,然后确保它们传递默认实现。然后,您不仅拥有用于 future 增强功能的测试框架,您还可以确信这些功能可以满足您的需求。

关于c++ - 自动判断用户自定义函数是否等同于隐式函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40257664/

相关文章:

c++ - 了解 int 存储多长时间?

c++ - 二叉树 - 插入非空树

c++ - 继承构造函数 vs 转发

c++ - 哪些编译器对 C++0x 的当前状态有最先进的支持?

c++ - MSVC 和 GCC 之间的 Lambda 语法不兼容

c++ - 通过值可变捕获的 lambda 不适用于 const &?

c++ - 向 vector 中插入数据时多次调用复制构造函数

c++ - 未使用指针类型推导出模板类型

c++ - std::ostream 忽略通过 setf() 在底层设置的十六进制标志

c++ - 将可变参数模板参数转换为其他类型