【问题标题】:Why do we need auto after function concept arguments in C++20?为什么我们在 C++20 中需要 auto after function 概念参数?
【发布时间】:2021-08-05 11:06:43
【问题描述】:

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

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(..)auto add(..) 是否具有相同的功能? (都编译)

【问题讨论】:

  • 可能通过避免类型和概念之间的歧义来提高可读性(和/或使实现更容易)。

标签: c++ templates c++20 auto


【解决方案1】:

所以问题真的是为什么我们需要 auto 在这里?

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

委员会对代码中可能出现这种歧义感到不舒服。因此,简洁的语法被修改为需要一个概念可以绑定到的实际类型占位符 (auto),而不是看起来像一个普通的声明。

第二个问题是返回类型有什么区别

那些不是类型,它们是为某种类型推断的占位符。

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

【讨论】:

  • 感谢您的解释。虽然当我有浮点自动返回类型时,返回 int(f1+f2);不会导致编译错误。它是编译器错误吗?
  • @EduardRostomyan - 这是一个模板。尝试调用它。它总是格式不正确,但允许不诊断未实例化的模板。
猜你喜欢
  • 2021-07-30
  • 2021-10-06
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
相关资源
最近更新 更多