首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将约束的自动占位符混合为非尾随返回类型和显式尾部返回类型。

将约束的自动占位符混合为非尾随返回类型和显式尾部返回类型。
EN

Stack Overflow用户
提问于 2022-04-17 10:28:42
回答 1查看 119关注 0票数 0

可以将约束的auto 占位符混合为非尾随返回类型和尾部返回类型吗?

演示

代码语言:javascript
复制
template<class T>
concept C = sizeof(T) > sizeof(char);

C auto g1(auto) -> int { return 1; }
C auto g2(auto) -> char { return '2'; }

int main() {
  return g1(0) + g2(0); 
}
  • GCC & MSVC:好,返回1 + '2',即使g2返回一个char
  • Clang:function with trailing return type must specify return type 'auto', not 'C auto'出错

我还以为

代码语言:javascript
复制
Concept auto foo(auto a, auto b) -> decltype(a + b)
{ return a + b; }

等于

代码语言:javascript
复制
auto foo(auto a, auto b) -> decltype(a + b)
    requires Concept<decltype(a + b)>
{ return a + b; }
EN

回答 1

Stack Overflow用户

发布于 2022-04-17 12:18:34

它们是不对等的。首先,正确的是:

代码语言:javascript
复制
auto foo(auto a, auto b) -> Concept decltype(a + b) // or Concept auto
{ return a + b; }

它定义了一个foo函数,它返回受Concept约束的类型Concept。如果不能,则会得到编译时错误。

另一个:

代码语言:javascript
复制
auto foo(auto a, auto b) -> decltype(a + b)
    requires Concept<decltype(a + b)>
{ return a + b; }

将返回一个类型的decltype(a + b),但该函数(而不是retun类型)仅在decltype(a + b)满足Concept时才被限制为有效,因此如果没有,您将不会收到任何错误,因为由于Concept子句的原因,不能使用该函数。

对于问题的“混合”部分:对于C auto g1(auto) -> int { return 1; },您可以这样说:"g1将返回某种必须满足C概念的推断类型(auto),然后您说返回int。这有点奇怪。所以您告诉编译器推断类型,然后明确地说明返回的类型。我认为这是没有意义的……

标准的标准还说:

“如果函数声明器包含跟踪-返回类型(dcl.fct),则该尾-返回类型指定函数的声明返回类型。”

如果标准在开始时不允许C auto,我什么也找不到,但它明确地定义,如果您有尾随返回类型,则尾部返回类型指定返回类型,而不是占位符auto。

所以在GCC和MSVC中,这可能是一个错误,或者他们只是故意忽略了.

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71901115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档