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++团队.
小智 9
不幸的是,我没有足够的"声誉"来评论,所以我会在这里添加我的评论.
@Peter Ruderman:列表中完全支持常量初始化.我还不能说它是否会进入Update 2,但我们会尽力而为.您正在收到没有constexpr构造函数的类型的警告,因为在调用树中检测到不同的 constexpr构造函数的错误.这通常来自std :: initializer_list <>.
@Peter Ruderman:另外,稍微纠正:对于使用constexpr构造函数调用初始化的静态生命周期对象,仅当初始化器是常量初始化器时才需要静态初始化,即仅由常量表达式组成.Update1执行此操作但不包含虚拟功能的类型.
另外:在OP的代码中,不需要静态初始化,但我认为编译器可以出于实现原因的原因进行静态初始化.这是因为使用'const'而不是'constexpr',后者需要静态初始化.
重申一下:禁用此警告是完全合理的(也是安全的).
| 归档时间: |
|
| 查看次数: |
4854 次 |
| 最近记录: |