如果类模板使用 lambda 作为默认模板参数,则该类类型的每个默认用法都将是一个新类型。
template <auto unique = [] {}>
struct UniqueStruct {};
static_assert(!std::is_same_v<UniqueStruct<>, UniqueStruct<>>);
但是,在单个翻译单元中,类的派生和别名在我测试的所有现代编译器中都将该派生/别名保留为单一类型。
using UniqueAlias = UniqueStruct<>;
static_assert(std::is_same_v<UniqueAlias, UniqueAlias>);
struct UniqueDerived : UniqueStruct<> {};
static_assert(std::is_same_v<UniqueDerived, UniqueDerived>);
这种行为是否可以在 TU 之间安全地保持,或者不同的 TU 是否有可能为
UniqueAlias
/ UniqueDerived
提出不同的 lambda 类型?如果是这样,是否会使这些类型在多个 TU 之间使用变得不安全,从而使 UniqueStruct
成为跨 TU 使用的唯一安全类型?
不同的 TU 是否有可能为 UniqueAlias 提出不同的 lambda 类型
别名不会创建新类型。它们仅引用(换句话说只是别名)现有类型。因此,对于
UniqueAlias
,该行为也适用于不同的 TU。