4

我正在使用Visual Studio 2010SP1。以下代码使编译器崩溃:

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限定符 on auto)?解决方法本质上是否完全相同(即我可以安全地使用它,直到编译器的错误被修复)?最后,我是唯一遇到此问题的人吗,如果没有,我将提交错误报告。

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

4

2 回答 2

4

C++11 中的代码格式不正确:如果有尾随返回类型,则“正常”返回类型必须是auto(C++11 规范在 8.3.5[dcl.fct]/2 中声明“ T 应是单个类型说明符 auto," 其中T是出现在函数名称之前的“类型”)。

所有编译器崩溃都是编译器错误,因此在编译您的程序时 Visual C++ 2010 编译器崩溃是一个错误。不过,此错误已得到修复;Visual C++ 2013 以适当的编译错误拒绝该程序。

于 2014-01-02T02:52:32.577 回答
1

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

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

C++ 标准草案中的相关部分是8.3.5 功能部分第2段,它说(强调我的):

在声明 TD 中,其中 D 具有以下形式

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

[...] T 应该是单个类型说明符 auto .[...]

于 2014-01-02T03:18:32.733 回答