在 C++11/17 中的类初始化和直接初始化中。有什么区别?

阿米特

当我看到这个 CPP Con 2017 网络研讨会时,Fedor Pikus 说:“它必须是直接初始化”

在此处输入图像描述这是网络研讨会的链接。

这些初始化方法有什么区别?(随后,为什么它必须是“直接”初始化?为什么“间接”初始化是“NOT”?)

// C++17 Compiler

#include <atomic>

class Example
{
    std::atomic<bool> m_b1 = false; // 1-h
    std::atomic<bool> m_b2{ false }; // 2-h

    static void example2()
    {
        std::atomic<bool> b1 = false; // 1-f
        std::atomic<bool> b3{ false }; // 2-f
        std::atomic<bool> b2(false); // 3-f

        // Do something
    }
};
用户17732522

std::atomic不可复制或移动。

在 C++17 之前,复制初始化std::atomic<int> x = 0;将首先构造一个临时对象,然后从该临时对象直接std::atomic<int>初始化如果没有移动或复制构造函数,这将失败,因此该行无法编译。0x

std::atomic<int> x(0);然而是直接初始化,只会使用构造函数x的参数0进行构造。

由于 C++17 没有临时性,并且在任何情况下x都将直接由构造函数调用以0作为参数进行初始化,因此不std::atomic存在不可移动的问题。从这个意义上说,幻灯片现在已经过时了。

即使在这种情况下,复制初始化和直接初始化的行为现在相同,但总的来说两者之间仍然存在差异。特别是直接初始化选择构造函数通过重载解析直接初始化变量,而复制初始化尝试找到隐式转换序列(可能通过转换构造函数或具有不同重载解析规则的转换函数)。此外,与直接初始化相比,复制初始化不考虑标记的构造函数explicit

关于问题中的代码片段。1-h并且1-f是如上所述的复制初始化。3-f是上面的直接初始化。2-h并且2-f是直接列表初始化,在某些情况下其行为与其他两种方式不同,但在这里它与带括号的直接初始化具有相同的效果。

一般来说,解释初始化形式之间的所有差异需要一段时间。众所周知,这是 C++ 中最复杂的部分之一。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C++11/17 中 std::atomic 的间接和直接初始化。有什么区别?

如何在c中全局初始化变量,静态和外部有什么区别?

类C,构造函数和统一初始化之间有什么区别?

用C中的以下方式初始化struct有什么区别?

“仅初始化设置器”提供了什么以及与 C# 中的只读设置有什么区别

在c ++中,这两个不同的字符串初始化之间有什么区别?

C ++中的初始化程序列表和类初始化。我有无参数构造函数,但仍必须使用初始化列表?

在C ++中编写初始化类

C初始化程序元素不是常量[数组和变量之间有什么区别]

在 C++ 中使用和不使用构造函数调用初始化对象有什么区别

C ++初始化字段直接与默认构造函数中的初始化列表

C ++类中的两种不同的变量初始化。有什么不同?

C ++ 03中的初始化初始化

C ++零初始化-为什么此程序中的`b`未初始化,而`a`已初始化?

在一行中初始化C中的所有变量和未初始化的值

C#中未初始化的struct与未初始化的类的大小是多少?

在 C# 中,类的属性是并发初始化还是顺序初始化?

C ++在初始化列表中的基类初始化之前调用函数

为什么在C和C ++之间初始化全局变量有这种区别?

用double初始化c ++中的int之间的区别

在 C++ 类中初始化 C 数组

C++中关于常量初始化和零初始化的顺序的矛盾定义

在C ++类中初始化大量变量

如何在C#中初始化嵌套类

在C ++中初始化派生类参数

在类构造函数中初始化const向量(C ++)

C ++对类中的未初始化变量启用警告

如何改善C#中的类对象初始化?

如何在C ++中重新初始化基类