根据Stack Overflow问题的接受(且唯一)答案,
使用定义构造函数
Run Code Online (Sandbox Code Playgroud)MyTest() = default;而是将零初始化对象.
那为什么以下,
#include <iostream>
struct foo {
foo() = default;
int a;
};
struct bar {
bar();
int b;
};
bar::bar() = default;
int main() {
foo a{};
bar b{};
std::cout << a.a << ' ' << b.b;
}
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
0 32766
Run Code Online (Sandbox Code Playgroud)
两个构造函数都是默认的?对?对于POD类型,默认初始化为零初始化.
根据这个问题的接受答案,
如果POD成员未在构造函数中初始化,也未通过C++ 11类内初始化,则默认初始化.
无论堆栈还是堆,答案都是一样的.
在C++ 98中(而不是之后),新的int()被指定为执行零初始化.
我认为,因为C++ 11用户定义的类型对象应该使用新{...}语法而不是旧(...)语法构造(除了构造函数重载std::initializer_list和类似参数(例如std::vector:size ctor vs 1 elem init_list ctor)).
好处是:没有狭义的隐式转换,最烦人的解析没有问题,一致性(?).我没有看到任何问题,因为我认为它们是相同的(除了给出的例子).
但他们不是.
该{}调用默认的构造函数.
......除非:
然后它看起来像是值而不是初始化对象?...即使对象已经删除了默认构造函数,{}也可以创建一个对象.这不是打败了删除的构造函数的全部目的吗?
......除非:
然后失败了call to deleted constructor.
......除非:
然后失败并丢失了字段初始值设定项.
但是,您可以使用它{value}来构造对象.
好吧也许这与第一个异常相同(值init对象)
......除非:
然后也{}不能{value}创建一个对象.
我相信我错过了一些.具有讽刺意味的是,它被称为统一初始化语法.我再说一遍:UNIFORM初始化语法.
这种疯狂是什么?
struct foo {
foo() = delete;
};
// All bellow OK (no errors, no warnings) …Run Code Online (Sandbox Code Playgroud) c++ language-lawyer aggregate-initialization list-initialization c++14
什么是构造函数的C++和默认访问,为什么?
公共,私人还是受保护?
我如何通过代码检查它?