const auto会导致编译器崩溃

Compiler crashes with const auto

本文关键字:编译器 崩溃 auto const      更新时间:2023-10-16

我使用的是带有SP1的Visual Studio 2010。下面的代码会使编译器崩溃:

template <typename T>
class MyClass
{
public:
  typedef int my_int;
  const my_int foo();
};
template <typename T>
const auto MyClass<T>::foo() -> my_int
// auto MyClass<T>::foo() -> const my_int // THIS WORKS!
{
  return my_int(1);
}
int main()
{
  MyClass<int> m;
  m.foo();
}

注意修复这个问题的注释行。我是否在这里正确使用auto(即const限定符上的auto)?是解决方案本质上完全相同的事情(即我可以安全地使用它,直到编译器的错误被修复)?最后,我是唯一一个遇到这个问题的人吗?如果不是,我将提交一个错误报告。

注意:我意识到这里的const没有什么意义。我试图在一个较小的项目中复制错误,在实际项目中,我返回一个const对对象的引用。

代码在c++ 11中是错误的:如果有一个尾随返回类型,那么"正常"返回类型必须是auto (c++ 11规范在8.3.5[dcl]中规定)。[fct]/2,"T应为单个类型说明符 auto",其中T是出现在函数名称之前的"类型")。

所有编译器崩溃都是编译器错误,所以Visual c++ 2010编译器在编译程序时崩溃是一个错误。不过,这个bug已经修复了;Visual c++ 2013拒绝程序,并给出正确的编译错误。

这是在多个编译器中尝试代码的情况之一,可能会帮助您认识到使用带有尾随返回类型的const auto是错误的。有几个在线的c++编译器。如果您在clang中尝试了这段代码,您将收到以下错误(实时示例):

错误:尾随返回类型的函数必须指定返回类型'auto',而不是'const auto'

c++标准草案中的相关部分是8.3.5 Functions段落2,其中说(强调我的):

在声明T D中,其中D的形式为

D1 ( parameter-declaration-clause ) cv-qualifier-seqopt
  ref-qualifieropt exception-specificationopt attribute-specifier-seqopt
    trailing-return-type

[…T应为单个类型说明符auto。[…]