相关疑难解决方法(0)

C++零初始化 - 为什么这个程序中的`b`未初始化,但是`a`被初始化了?

根据Stack Overflow问题的接受(且唯一)答案,

使用定义构造函数

MyTest() = default;
Run Code Online (Sandbox Code Playgroud)

而是将零初始化对象.

那为什么以下,

#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类型,默认初始化为零初始化.

根据这个问题的接受答案,

  1. 如果POD成员未在构造函数中初始化,也未通过C++ 11类内初始化,则默认初始化.

  2. 无论堆栈还是堆,答案都是一样的.

  3. 在C++ 98中(而不是之后),新的int()被指定为执行零初始化.

尽管试图将我的(虽然很小)头部包裹在默认构造函数默认初始化之间,但我无法提出解释.

c++ initialization language-lawyer

129
推荐指数
3
解决办法
7552
查看次数

删除了默认构造函数.仍然可以创建对象......有时候

c ++ 11统一初始化语法的天真,乐观和哦......错误的观点

我认为,因为C++ 11用户定义的类型对象应该使用新{...}语法而不是旧(...)语法构造(除了构造函数重载std::initializer_list和类似参数(例如std::vector:size ctor vs 1 elem init_list ctor)).

好处是:没有狭义的隐式转换,最烦人的解析没有问题,一致性(?).我没有看到任何问题,因为我认为它们是相同的(除了给出的例子).

但他们不是.

一个纯粹疯狂的故事

{}调用默认的构造函数.

......除非:

  • 删除默认构造函数
  • 没有定义其他构造函数.

然后它看起来像是值而不是初始化对象?...即使对象已经删除了默认构造函数,{}也可以创建一个对象.这不是打败了删除的构造函数的全部目的吗?

......除非:

  • 该对象有一个删除的默认构造函数和
  • 其他构造函数定义.

然后失败了call to deleted constructor.

......除非:

  • 该对象有一个删除的构造函数和
  • 没有其他构造函数定义和
  • 至少是一个非静态数据成员.

然后失败并丢失了字段初始值设定项.

但是,您可以使用它{value}来构造对象.

好吧也许这与第一个异常相同(值init对象)

......除非:

  • 该类有一个删除的构造函数
  • 并且至少有一个数据成员默认初始化.

然后也{}不能{value}创建一个对象.

我相信我错过了一些.具有讽刺意味的是,它被称为统一初始化语法.我再说一遍:UNIFORM初始化语法.

这种疯狂是什么?

情景A.

删除默认构造函数:

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

49
推荐指数
3
解决办法
6977
查看次数

c ++中构造函数的默认访问权限是什么

什么是构造函数的C++和默认访问,为什么

公共,私人还是受保护?

我如何通过代码检查它?

c++ constructor default public

3
推荐指数
1
解决办法
1430
查看次数