POD成员默认初始化没有大括号

时间:2017-04-17 16:05:54

标签: c++ c++14 list-initialization

给定代码:

struct Test {
    int a = 1;
    int b = 2;
};

Test test1;
Test test2{};

对于test2,我确定test2.a == 1test2.b == 2test1(没有{})是否保证(或不相同)?

3 个答案:

答案 0 :(得分:7)

该行

Test test1;

相当于使用默认构造函数进行初始化,在没有手写的具有显式初始化列表但没有Test() = deleted;的情况下,最终会将两个成员设置为其指定的初始值{{ 1}}和1

“默认构造函数”是一个可以不带参数调用的构造函数,这与上述语句完全相同。

您可以在standard中阅读默认构造函数的规则 - 转到§12.1第4节:

  

类X的默认构造函数是类X的构造函数,可以不带参数调用...

在第5节中进一步说明:

  

默认构造函数(默认构造函数,默认情况下未定义为已删除)是在odrused(3.2)创建其类类型的对象(1.8)时隐式定义的...

答案 1 :(得分:6)

是的,它们在这里有相同的效果。

对于第一种情况,它是default initialization

  

如果T是类类型,则考虑构造函数并对空参数列表进行重载解析。选择的构造函数(它是默认构造函数之一)被调用以提供新对象的初始值;

这意味着将调用隐式定义的默认构造函数;它没有使用任何成员初始化列表,然后default member initializer将生效初始化数据成员。

对于第二种情况,它是aggregate initialization

  

如果初始化程序子句的数量小于成员数and bases (since C++17)或初始化程序列表完全为空,则剩余成员and bases (since C++17)将被初始化by their default initializers, if provided in the class definition, and otherwise (since C++14) ...

因此,默认成员初始化程序也将生效,以初始化数据成员。

答案 2 :(得分:4)

$(document).ready(function(){ $(window).scroll(function(){ if ($(this).scrollTop() > 150) { $('.fscrollonh').css({"opacity": "0.1", "visibility": "visible"}); $('.fscrollonh').show(500); } else { $('.fscrollonh').hide(500); } }); }); 也保证其成员test1初始化为a,其成员1初始化为b

来自C++11 FAQ, In-class member initializers

  

C ++ 11的基本思想是允许在声明它(在其类中)的地方初始化非静态数据成员。然后,构造函数可以在需要运行时初始化时使用初始化程序。考虑:

2
     

这相当于:

class A {
  public:
    int a = 7;
};