C++;14非聚合上的统一初始化 我使用Visual C++ 2013。当类是聚合时,它初始化为零。当它是非聚合时,它似乎是默认初始化的,并且不确定。为什么呢 #include <iostream> using namespace std; class Test_1 { public: int i; void f(){}; }; class Test_2 { public: int i; virtual void f(){}; }; int main() { Test_1 t1{}; Test_2 t2{}; cout<<t1.i<<endl; //0 cout<<t2.i<<endl; //-858993460 getchar(); } #包括 使用名称空间std; 课堂测试1 { 公众: int i; void f(){}; }; 课堂测试2 { 公众: int i; 虚空f(){}; }; int main() { 测试_1 t1{}; 测试_2 t2{}; cout

C++;14非聚合上的统一初始化 我使用Visual C++ 2013。当类是聚合时,它初始化为零。当它是非聚合时,它似乎是默认初始化的,并且不确定。为什么呢 #include <iostream> using namespace std; class Test_1 { public: int i; void f(){}; }; class Test_2 { public: int i; virtual void f(){}; }; int main() { Test_1 t1{}; Test_2 t2{}; cout<<t1.i<<endl; //0 cout<<t2.i<<endl; //-858993460 getchar(); } #包括 使用名称空间std; 课堂测试1 { 公众: int i; void f(){}; }; 课堂测试2 { 公众: int i; 虚空f(){}; }; int main() { 测试_1 t1{}; 测试_2 t2{}; cout,c++,c++14,uniform-initialization,C++,C++14,Uniform Initialization,如果编译器正在执行此操作,则它已损坏 [dcl.init.list]/p3(所有报价均来自N4140): 定义了T类型的对象或引用的列表初始化 详情如下: 如果T是聚合,则执行聚合初始化(8.5.1) 否则,如果初始值设定项列表没有元素且T是具有默认构造函数的类类型,则对象为 值已初始化 [……] [dcl.init]/p8: 对T类型的对象进行值初始化意味着: 如果T是(可能是cv限定的)类类型(第9条),没有默认构造函数(12.1)或默认构造函数是 用户提供或删除,则对象默认初始化 如

如果编译器正在执行此操作,则它已损坏

[dcl.init.list]/p3(所有报价均来自N4140):

定义了
T
类型的对象或引用的列表初始化 详情如下:

  • 如果
    T
    是聚合,则执行聚合初始化(8.5.1)
  • 否则,如果初始值设定项列表没有元素且
    T
    是具有默认构造函数的类类型,则对象为 值已初始化
  • [……]
[dcl.init]/p8:

T
类型的对象进行值初始化意味着:

  • 如果
    T
    是(可能是cv限定的)类类型(第9条),没有默认构造函数(12.1)或默认构造函数是 用户提供或删除,则对象默认初始化
  • 如果
    T
    是一个(可能是cv限定的)类类型,没有用户提供或删除的默认构造函数,则对象是 零初始化和的语义约束 默认初始化被检查,如果T有一个非平凡的默认值 构造函数,对象默认初始化
  • 如果T是数组类型,则每个元素都初始化为值
  • 否则,对象初始化为零

Test\u 2
不是一个聚合,因此应该初始化
t2
的值。反过来,由于
Test\u 2
的默认构造函数不是用户提供的,
t2
应该先初始化为零(导致
t2.i
被初始化为0),然后运行默认构造函数。

哪个编译器和哪个版本?
{}
应该是非聚合的值初始化,而
t2。i
应该是零初始化的,因为它没有用户提供的构造函数。这会导致托管在上的MSVC挂起,然后产生类似的垃圾。另一个也是一样。我嗅到了一个bug。在VC++中,非平凡类的值初始化确实被破坏了,并且总是b令人遗憾的是,尽管初始化语义的本质是必要的,但仍然看不到修复。这是许多提交的bug报告之一,我看到的都是“延迟”关闭的。