可以将约束的auto 占位符混合为非尾随返回类型和尾部返回类型吗?
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);
}1 + '2',即使g2返回一个charfunction with trailing return type must specify return type 'auto', not 'C auto'出错我还以为
Concept auto foo(auto a, auto b) -> decltype(a + b)
{ return a + b; }等于
auto foo(auto a, auto b) -> decltype(a + b)
requires Concept<decltype(a + b)>
{ return a + b; }发布于 2022-04-17 12:18:34
它们是不对等的。首先,正确的是:
auto foo(auto a, auto b) -> Concept decltype(a + b) // or Concept auto
{ return a + b; }它定义了一个foo函数,它返回受Concept约束的类型Concept。如果不能,则会得到编译时错误。
另一个:
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中,这可能是一个错误,或者他们只是故意忽略了.
https://stackoverflow.com/questions/71901115
复制相似问题