错误C4592:符号将动态初始化.VS2015.1 static const std :: vector field

Mak*_*sim 17 c++ visual-c++ visual-studio-2015

更新后VS2015.1下一个代码不再编译:

class testClass
{
static const std::vector<int> test;
};
Run Code Online (Sandbox Code Playgroud)

初始化

const std::vector<int> testClass::test =
{
    1,2
};
Run Code Online (Sandbox Code Playgroud)

有错误:

错误C4592:'test':符号将被动态初始化(实现限制)

是编译器中的错误或改变了什么?

小智 38

VC++编译器dev在这里.

彼得·鲁德曼的回答几乎是正确的.该警告实际上是指constexpr对象,其中初始化中涉及constexpr构造函数调用.在Update1中,我们现在可以使用constexpr构造函数静态初始化文字类型和一些非文字类型,但不是全部.具体来说,具有虚拟成员函数将阻止静态初始化,即使该类型具有constexpr构造函数并且提供有常量初始化程序.该警告旨在诊断此类病例.不幸的是,当初始化列表中的表达式类型具有constexpr构造函数时,有一个错误导致它触发(在OP的示例中,std :: vector没有,但是std :: initializer_list没有).可以安全地忽略此警告,因为编译器没有做任何与以前不同的操作.

我们已经修复了这个错误,但遗憾的是发现它包含在Update 1中已经太晚了.无论如何,当我们进行更完整的常量初始化(3.6.2)时,对这个警告的需求应该消失.

Tanveer Gani Visual C++团队.

  • 我们可以在MSDN上记录这些内容吗?获得未在MSDN上任何地方列出的警告是非常令人沮丧的,特别是当他们的原因如此微妙时. (8认同)
  • 根据Tanveer的说法,bugfix应该包含在Update 1之后.但是,我仍然遇到Update 3的这个问题. (4认同)

小智 9

不幸的是,我没有足够的"声誉"来评论,所以我会在这里添加我的评论.

@Peter Ruderman:列表中完全支持常量初始化.我还不能说它是否会进入Update 2,但我们会尽力而为.您正在收到没有constexpr构造函数的类型的警告,因为在调用树中检测到不同的 constexpr构造函数的错误.这通常来自std :: initializer_list <>.

@Peter Ruderman:另外,稍微纠正:对于使用constexpr构造函数调用初始化的静态生命周期对象,仅当初始化器是常量初始化器时才需要静态初始化,即仅由常量表达式组成.Update1执行此操作但不包含虚拟功能的类型.

另外:在OP的代码中,不需要静态初始化,但我认为编译器可以出于实现原因的原因进行静态初始化.这是因为使用'const'而不是'constexpr',后者需要静态初始化.

重申一下:禁用此警告是完全合理的(也是安全的).