如何强制编译器显示隐式构造函数

How to force the compiler to show implicit constructors

本文关键字:构造函数 显示 何强制 编译器      更新时间:2023-10-16

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';
}

从那里开始,您可能会想到自己增强和概括它。