非静态数据成员初始化的未来

在Visual Studio 2013中,我们提供了一个非静态数据成员初始化的实现(这里称为“NSDMI”),这是一个允许以下代码的功能:

null

C类{ int n=42; };

在这里, n 是类的非静态成员,它直接在其声明中初始化,而不是通过构造函数初始化。

不幸的是,我们的编译器(其中一些是30年前编写的)中用于处理初始化的代码受到许多长期的体系结构限制。此代码对于C++ 03风格的初始化是足够的,但是NSDMI是C++ 11的特性,导致它表现为严重的缺陷。这些bug中的一个在 MSDN关于错误C2797的文章 . 非静态数据成员初始值设定项中的列表初始化将被静默地转换为函数调用,从而导致不正确的行为。也就是说,如果有人写道:

#包括

S类 { std::向量v{1,2}; };

编译器会将上述代码视为用户编写了:

#包括

S类 { std::vectorv=std::vector(1,2); };

VisualStudio2013 RTM编译器不是用两个给定元素初始化向量,而是用一个长度和一个元素初始化向量。在过去的一年里,我们收到了无数关于这种行为的错误报告。此外,这不是阻止初始值设定项列表正常工作的唯一问题。

我们最初计划在VisualStudio2013的更新中修复这个bug,但是从工程的角度来看,正确的做法是避免另一个混乱,并彻底解决初始化的处理问题。但是,由于需要修改大量的基本代码,因此彻底检查编译器体系结构是一项艰巨的任务。我们不能冒险在更新中创建不兼容或大的bug尾巴,因此NSDMI的正确实现只能在主要版本中发布。

同时,我们仍然需要处理源源不断的关于错误代码生成的反馈,因此我们做出了创建错误C2797的艰难决定。正如MSDN文章所建议的那样,这个错误引导用户避免这个问题,并通过编写内部列表的显式结构来解决它。例如,以下代码按预期工作:

#包括

S类 { std::vectorv=std::vector{1,2}; };

我们知道,Visual Studio 2013 Update 3的发行说明中没有包含有关此新错误的通知。这是一个错误,我们真诚地为由此造成的任何混乱道歉。但是,C2797将继续出现在VisualStudio2013的所有未来版本中,因此我们建议您立即使用提供的解决方法。用于初始化的体系结构更改和修复将包含在VisualStudio“14”RTM中。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享