可选类型名是否适用于概念?

PHD*_*PHD 3 c++ language-lawyer c++-concepts c++20

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>;
    };
Run Code Online (Sandbox Code Playgroud)

但是当我typenameT::value_typeand前面指定时T::iterator,它会编译。

Bar*_*rry 8

从论文中,强调我的:

因此,我们建议typename在许多已知只允许类型名称的常见上下文中将其设为可选项

该论文typename仅在您需要类型的那些地方成为可选的。在别名声明的右侧,需要是一个类型。在 a 中static_cast,需要是一个类型,等等。

但在这里:

template<typename T>
concept sample_concept = std::default_initializable<T::value_type>;
Run Code Online (Sandbox Code Playgroud)

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

你可以问:嗯,特别是在概念中,因为你不能重载一个概念或(当前)有依赖的概念,你可以只查看概念,看看它是否需要一个类型。但是,对于少量的增益,复杂性会大大增加,如果我们将来添加相关概念,它会变得更复杂和更小。