可选类型名称适用于概念吗



GCC实现了P0634R3,当类型在已知上下文中时,它放弃了指定typename的需要。

它也适用于concept吗?

因为以下代码没有编译:

template<typename T>
concept sample_concept =
std::default_initializable<T::value_type> &&
requires (T t) {
{ t.some_func(std::declval<T::some_type>()) }
-> std::same_as<T::iterator>;
};

但当我在T::value_typeT::iterator前面指定typename时,它会编译。

从论文中,重点挖掘:

因此,我们建议在许多常见的上下文中使typename是可选的,这些上下文已知仅允许类型名称

该论文使typename仅在需要具有类型的地方是可选的。在别名声明的右侧,需要是一个类型。在一个static_cast中,需要一个类型等

但是这里:

template<typename T>
concept sample_concept = std::default_initializable<T::value_type>;

事实并非如此。虽然default_initializable的参数是一个类型参数,但也可以有采用非类型模板参数或模板模板参数的概念。因此,这不是一种只允许类型名称的情况,因此typename在这里仍然是强制性的。

你可以问:好吧,特别是在概念中,因为你不能重载一个概念或(目前(有依赖的概念,你可以看看这个概念,看看它是否需要一个类型。但这是一个巨大的复杂性增加,只需要少量的增益,如果我们在未来添加依赖的概念,这将变得更加复杂和更小。

相关内容

最新更新