const auto会导致编译器崩溃
Compiler crashes with const auto
我使用的是带有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。[…]
相关文章:
- 为什么所有C++编译器都会崩溃或挂起此代码
- 如果可推导类型上有替换,可变参数模板类型推导会使编译器崩溃
- 包含未定义行为的源代码使编译器崩溃是否合法?
- MSVC 编译器在调试模式下构建 Qt 5.10 时崩溃
- icc崩溃:编译器能在抽象机器中不存在的地方发明写入吗
- 编译器崩溃与C++数组
- Visual Studio MSC++编译器崩溃
- C++具有显式强制转换的代码,导致Visual Studio编译器崩溃
- __declspec(dllimport)导致MSVC 2010上的编译器崩溃
- 使用C++11期货:std::async崩溃的嵌套调用:编译器/标准库错误
- 编译最简单的代码时,VC++编译器崩溃
- 由于未定义的行为或编译器错误而导致C++代码崩溃
- 尝试使用 CreateProcess() ;没有编译器错误,但 main 不断崩溃
- 类崩溃编译器中的 MSVC 2010 模板化映射
- 当用户将值输入到向量中时,编译器崩溃
- 另一个类中的自定义类实例数组使编译器崩溃
- 是我的编译器将适当的代码优化为无用的崩溃代码
- Microsoft c++优化编译器不断崩溃
- 尝试为MSIProcessMessage提供可变函数导致c++编译器崩溃
- const auto会导致编译器崩溃