为何GCC4.8.5在C++11模式下允许无尾返回类型的auto返回值?
为什么GCC4.8.5在C++11模式下允许无尾返回类型的auto函数?
首先明确标准规则:
- 在C++11标准中,
auto作为函数返回类型时,必须配合**尾返回类型(-> decltype(...))**使用,没有尾返回类型的写法属于违反标准的语法错误。 - 无尾返回类型的
auto函数返回值推导是C++14引入的正式特性。
你遇到的GCC4.8.5仅警告不报错的情况,本质是GCC的扩展特性:
GCC从4.8版本开始,对部分C14的语法提供了实验性提前支持,即使指定-std=c++11编译,也不会直接拒绝这种写法,而是输出警告提示你这不符合当前编译标准的语法,但仍会尝试按照C14的规则进行类型推导并生成可执行程序。
这种行为是GCC为了方便开发者提前适配新语法而做的兼容,并非标准C11的要求。如果你希望严格遵循C11标准,强制将该警告转为错误,可以添加编译选项-Werror=return-type,此时编译器就会拒绝这种写法。
举个对比例子:
- C++11标准合规写法:
template <typename Func, typename ...Args> auto post(Func func, Args... args) -> decltype(func(args...));
- C++14及以上的简化写法:
template <typename Func, typename ...Args> auto post(Func func, Args... args);
内容的提问来源于stack exchange,提问作者AlexShane
相关产品推荐
相关产品推荐

