可选类型名称是否适用于概念?
Does optional typename apply to concept?
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_type
和T::iterator
前面指定typename
时,它编译。
来自论文,强调我的:
We therefore propose we make typename
optional in a number of commonplace contexts that are known to only permit type names.
该论文仅在您需要具有类型的那些地方使typename
可选。在别名声明的 right-hand 一侧,需要是一个类型。在static_cast
中,需要是类型等
但是这里:
template<typename T>
concept sample_concept = std::default_initializable<T::value_type>;
事实并非如此。虽然 default_initializable
的参数是类型参数,但您也可以有采用 non-type 模板参数或模板模板参数的概念。所以不是只允许类型名的情况,所以这里typename
还是必须的
您可能会问:好吧,特别是在概念中,因为您不能重载概念或(当前)有依赖概念,您可以只查看概念并查看它是否是否采用类型。但这是为了获得少量收益而大大增加复杂性,如果我们在未来添加相关概念,它会变得更复杂和更小。
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_type
和T::iterator
前面指定typename
时,它编译。
来自论文,强调我的:
We therefore propose we make
typename
optional in a number of commonplace contexts that are known to only permit type names.
该论文仅在您需要具有类型的那些地方使typename
可选。在别名声明的 right-hand 一侧,需要是一个类型。在static_cast
中,需要是类型等
但是这里:
template<typename T>
concept sample_concept = std::default_initializable<T::value_type>;
事实并非如此。虽然 default_initializable
的参数是类型参数,但您也可以有采用 non-type 模板参数或模板模板参数的概念。所以不是只允许类型名的情况,所以这里typename
还是必须的
您可能会问:好吧,特别是在概念中,因为您不能重载概念或(当前)有依赖概念,您可以只查看概念并查看它是否是否采用类型。但这是为了获得少量收益而大大增加复杂性,如果我们在未来添加相关概念,它会变得更复杂和更小。