【问题标题】:Are types allowed to be specified for return-type-requirement in a requires expression?是否允许在 requires 表达式中为 return-type-requirement 指定类型?
【发布时间】:2019-09-02 04:36:08
【问题描述】:

看这个简单的概念示例:

template <typename T>
requires requires(T t) { { t+t } -> bool; }
void fn() {
}

int main() {
    fn<bool>();
}

在这里,我使用bool 作为return-type-requirementtype-constraint。当前草稿says

类型约束:

嵌套名称说明符选择概念名称

nested-name-specifier opt concept-name

所以type-constraint 必须是concept-namebool(或任何类型)是否允许作为概念名称?如果是,它是什么意思,标准草案在哪里允许它?我认为bool 不是一个概念,所以这是不允许的。然而,gcc 和 clang 都编译了我的示例:godbolt

(当然,允许类型是有道理的,我只是不明白标准在哪里允许这样做,以及它的确切含义:类型应该完全匹配吗?还是可以发生转换?)

【问题讨论】:

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


    【解决方案1】:

    是否允许 bool(或任何类型)作为概念名称?

    不,bool(或任何类型)不是概念。它们是类型。

    最初的设计和 Concepts TS 确实允许使用类型。也就是说,您可以编写如下复合需求:

    { E } -> int;
    

    但这已被P1452R2 从 C++20 中删除。删除它的原因有很多,其中一个动机是它会干扰希望采用auto 的通用形式的未来方向,例如vector&lt;auto&gt;vector&lt;Concept&gt;

    类型要求允许你表达什么,无论如何你已经可以表达了,无论哪种方式:

    { E } -> std::same_as<int>;
    { E } -> std::convertible_to<int>;
    

    是有意的。这也回答了您关于类型要求的实际含义的问题 - 完全匹配或允许转换。

    【讨论】:

    • 当我查找same_as 时,它有两种类型,类似于is_same,只是它是一个概念。这是如何运作的? E 是替换为第一个参数还是第二个参数,还是完全替换为其他参数?
    • @user975989 第一个模板参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    相关资源
    最近更新 更多