为什么我们在 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 通过概念检查的类型,否则推导将失败。
我有以下编译错误导致我无法理解。
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 通过概念检查的类型,否则推导将失败。