为什么我可以在 C++11 中使用推导返回类型而不使用尾随返回类型?

why can I use deduced return type without trailing return type in c++11?

提问人:AlexShane 提问时间:9/26/2023 更新时间:9/26/2023 访问量:70

问:

我了解到自动推断的返回类型是 c++14 的一个特性,如下所示

template <typename Func, typename ...Args>
auto post(Func func, Args... args);

有人告诉我,如果我想在 C++11 中使用它,我必须使用尾随返回类型,如下所示

template <typename Func, typename ...Args>
auto post(Func func, Args... args) -> decltype(xxxxxx);

但实际上我可以在我的 PC 中成功编译 no-trailing-return-type 的,编译器不会报告错误,它只是报告这样的警告:std=c++11

warning: 'post' function uses 'auto' type specifier without trailing return type [enabled by default]

尽管有此警告信息,但该程序仍按照我的设计运行良好。为什么不是错误消息? 我想知道为什么编译器允许我这样做,因为这是 c++14 的功能。我注意到警告信息中有一个。这是否意味着编译器强制自己接受这种语法?顺便说一句,我的编译器是gcc 4.8.5std=c++11[enabled by default]

我用(使用 gcc 4.8.5)编译它std=c++11

template <typename Func, typename ...Args>
auto post(Func func, Args... args);

我认为它应该报告一个错误,但它确实报告了警告,然后允许我这样做:

warning: 'post' function uses 'auto' type specifier without trailing return type [enabled by default]
C++ 自动

评论

1赞 Some programmer dude 9/26/2023
不相关,但为什么要使用现在过时的 GCC 版本 4.8.5?GCC 现在最高版本为 13.2。八年(4.8.5 版本有多旧)对于计算机相关的事情来说是一段很长的时间,从那时起发生了很多事情。
0赞 AlexShane 9/26/2023
@Someprogrammerdude 不幸的是,由于我的公司,我仍然使用 4.8.5。我们使用一些特殊的机器进行开发,编译器版本仍然是 4.8.5,原因有很多。在下个月晚些时候,我们将将其更新到 gcc 7.3.0
0赞 Red.Wave 9/26/2023
它可能是一个编译器扩展,以支持某些 -then- future std 功能。该警告意味着代码无法移植到其他 C++11 平台。
1赞 Öö Tiib 9/26/2023
请注意,C++ 标准不区分“警告”和“错误”。在某些情况下,它需要实现来发出诊断。您在 C++11 模式下进行了诊断,因此它符合要求。它可能但不是必需的,除非在任何其他情况下编译失败 #error 但在预处理器指令的情况下。

答:

1赞 Caleth 9/26/2023 #1

因为编译器具有 C++14 功能,所以要在 C++14 模式下进行编译。在 C++11 模式下,默认情况下,它启用它作为语言的非标准扩展。该选项会关闭这些扩展,这将使它成为错误。-pedantic-errors

在 godbolt 上看到它

评论

0赞 AlexShane 9/26/2023
谢谢你的回答!它完全解决了我的问题。