【问题标题】:Does optional typename apply to concept?可选类型名是否适用于概念?
【发布时间】:2020-09-01 13:53:35
【问题描述】:

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 时,它会编译。

【问题讨论】:

    标签: c++ language-lawyer c++20 c++-concepts


    【解决方案1】:

    从论文中强调我的:

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

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

    但是在这里:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      相关资源
      最近更新 更多