ODR 如何与使用默认为 lambda 表达式的非类型模板的“唯一”类型交互?

问题描述 投票:0回答:1

如果类模板使用 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 使用的唯一安全类型?

c++ templates c++20 one-definition-rule
1个回答
0
投票

不同的 TU 是否有可能为 UniqueAlias 提出不同的 lambda 类型

别名不会创建新类型。它们仅引用(换句话说只是别名)现有类型。因此,对于

UniqueAlias
,该行为也适用于不同的 TU。

© www.soinside.com 2019 - 2024. All rights reserved.