如何强制编译器显示隐式构造函数
How to force the compiler to show implicit constructors
gcc 或 clang 有"-E"选项来运行预处理器并显示如何扩展所有宏,我需要这样的东西来隐式生成的方法。
有没有办法强制 gcc 或 clang 为每个类打印隐式创建和删除的构造函数/析构函数/赋值运算符?
您可以使用模板类型特征作为解决方法,从某些类型中提取此类信息。这无法区分某些内容是显式删除还是隐式删除,但如果您没有明确删除,您肯定知道,例如
#include <iostream>
#include <type_traits>
struct A {
A(const A&) = delete;
};
int main() {
std::cout << std::boolalpha << std::is_trivially_default_constructible_v<A> << 'n';
std::cout << std::boolalpha << std::is_copy_assignable_v<A> << 'n';
std::cout << std::boolalpha << std::is_trivially_move_constructible_v<A> << 'n';
}
将产生false, true, false
,即例如,当复制构造函数被显式删除时,隐式删除了微不足道的默认构造函数。
编辑:下面是一个示例,该示例通过类层次结构并找到违反特定特征的基类:
#include <iostream>
#include <type_traits>
#include <typeinfo>
struct A {
A(const A&) = delete;
A(A&&) noexcept { }
};
struct B : A {
using base_type = A;
B(B&& b) : A(std::move(b)) { }
};
struct C : B {
using base_type = B;
};
struct D : C {
using base_type = C;
};
template <typename T, bool = std::is_nothrow_move_constructible_v<typename T::base_type>>
struct check { };
template <typename T>
struct check<T, false> : check<typename T::base_type> { };
template <typename T>
struct check<T, true> {
using result_t = T;
};
int main() {
std::cout << typeid(check<D>::result_t).name() << 'n';
}
从那里开始,您可能会想到自己增强和概括它。
相关文章:
- C++ 构造函数未显示输出
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- 如果构造函数和析构函数可以获取和显示(打印)数据,为什么我们需要 getter 和 setter?
- 如何强制编译器显示隐式构造函数
- 如何让我的构造函数和函数工作,以便我的 main() 能够同时显示字符串和 int 数据
- 为什么在类构造函数方法中,std::string 参数在调试时显示不同的结果?
- 如果构造函数从调用到 std::make_shared 崩溃,GDB 是否可以显示崩溃的详细信息
- 为什么析构函数和复制构造函数使用对象数组显示此行为
- 为什么Visual Studio的Intellisense不显示构造函数?
- 复制构造函数语法并显示构造函数的值
- Doxygen 不显示如何从其他类调用记录的成员函数(包括构造函数)
- 聚合类正在显示默认构造函数
- C++构造函数并使其显示默认答案
- 将构造函数声明为private会显示错误.是否至少有一个公共构造函数是必需的
- 如何在qt构造函数完成执行前显示窗体
- 显示 new() 在 malloc 返回的地址调用对象的构造函数的源代码
- C++继承类没有显示默认构造函数
- Valgrind显示的数据在构造函数c++中肯定丢失了
- 需要一个示例来显示默认构造函数不是继承的
- 共享的解引用指针值显示不同的结果(当应用隐式复制构造函数时).为什么