为什么我们需要在C++20中的函数概念参数之后使用auto?
我有以下编译错误,导致我无法理解。
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 ?(签名对我来说似乎很奇怪)
第二个问题是返回类型有什么区别:
floating_point auto add(..)vsauto add(..)相同的功能?(两者都编译)
回答
所以问题真的是为什么我们在这里需要 auto ?
因为floating_point不是类型,add也不是普通函数。然而,像void add(floating_point, floating_point);totally 这样的东西看起来像一个普通的函数声明,这里没有任何东西告诉我们这实际上是一个用简洁语法编写的模板。
委员会对代码中可能出现这种歧义感到不舒服。因此,简洁的语法被修改为需要auto概念可以绑定到的实际类型占位符 ( ),而不是看起来像一个普通的声明。
第二个问题是返回类型有什么区别
这些不是类型,那些是为某种类型推断的占位符。
这个概念唯一增加的一点是,in 中的 return 语句add必须返回通过概念检查的类型,否则推导将失败。
- @EduardRostomyan - 这是一个模板。尝试调用它。它总是格式错误,但允许不诊断非实例化模板。