为什么我们在 C++20 中需要在函数概念参数之后自动?

Why do we need auto after function concept arguments in C++20?

我有以下编译错误导致我无法理解。

template<typename T>
concept floating_point = std::is_floating_point_v<T>;

auto add(const floating_point f1, const floating_point f2)
{
    return f1+f2;
}

在上面的版本中,编译器报错:

ssource>:6:16: error: expected 'auto' or 'decltype(auto)' after 'floating_point'
    6 | auto add(const floating_point  f1, const floating_point f2)

当我添加自动说明符时,一切都很好。

auto add(const floating_point auto f1, const floating_point auto f2)
{
    return f1+f2;
}

这个很好用。

所以真正的问题是为什么我们在这里需要 auto ? (签名对我来说很奇怪)

第二个问题是return类型有什么区别:

floating_point auto add(..)auto add(..) 对于相同的功能? (均编译)

So the question really is why do we need auto here?

因为 floating_point 不是类型,并且 add 不是普通函数。然而,像 void add(floating_point, floating_point); 这样的东西看起来完全像是一个普通的函数声明,这里没有任何东西告诉我们这实际上是一个用简洁语法编写的 模板

委员会对代码中可能存在这种歧义感到不安。因此,修改了简洁的语法以要求概念可以绑定到的实际类型占位符 (auto),而不是看起来像普通声明。

The second question is what is the difference in return types

这些不是类型,它们是占位符,用于推导某种类型。

概念唯一增加的是 add 中的 return 语句必须 return 通过概念检查的类型,否则推导将失败。