考虑以下代码:
#include <type_traits>
template<typename T>
concept Int = std::is_same_v<T, int>;
template<typename T>
concept Float = std::is_same_v<T, float>;
template<typename T>
struct Foo
{
Foo() requires Int<T> = default; // #1
Foo() requires Int<T> || Float<T> = default; // #2
};
static_assert(std::is_trivial_v<Foo<float>>);
Run Code Online (Sandbox Code Playgroud)
为了满足静态断言,Foo<float>需要是一个平凡的类型,因此,既然它是一个类类型,那就是一个平凡的类。因此,除了可以简单地复制(确实如此)之外,它还必须有一个合格的默认构造函数(并且所有此类构造函数都必须是简单的,class.prop#2 ),这是合格的特殊成员函数的特例,定义通过特殊#6:
符合条件的特殊成员函数是指满足以下条件的特殊成员函数:
- 该功能未删除,
- 满足关联的约束([temp.constr])(如果有),并且
- 没有同类的特殊成员函数受到更多限制([temp.constr.order])。
严格地说,Foo<float>不存在合格的默认构造函数,因为#1不满足 的约束,并且#2存在更受约束的默认构造函数 ( #1)。因此,Foo<float>这不是一个简单的课程。但是,上面的代码可以在 …