当我看到这个 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
}
};
std::atomic
不可复制或移动。
在 C++17 之前,复制初始化std::atomic<int> x = 0;
将首先构造一个临时对象,然后从该临时对象直接std::atomic<int>
初始化。如果没有移动或复制构造函数,这将失败,因此该行无法编译。0
x
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] 删除。
我来说两句