{x} 和 '= {x}' 初始化之间有什么区别(如果有的话)?
What is the difference, if any, between {x} and '= {x}' initialization?
我试图理解这两种初始化方式之间的语义差异:
Foo foo{x};
Foo foo = {x};
我很想知道以下情况的区别:
- CCD_ 1是CCD_
Foo
有一个构造函数,它接受与x类型相同的参数x
不是Foo
类型,但有一个转换构造函数可用x
不是Foo
类型,但是explicit
转换构造函数是可用的
我的意思是,在每种情况下:
- 从概念上讲,调用了哪些构造函数
- 编译器通常会优化哪些构造函数调用
- 是否允许隐式转换
Foo foo{x}; // 1
Foo foo = {x}; // 2
1是直接列表初始化。2是复制列表初始化。
假设Foo
是一个类类型,那么在大多数情况下,它们在概念上或其他方面都会做完全相同的事情,只是如果在重载解析过程中选择了显式构造函数,那么#2就是格式错误的。特别是,与复制初始化不同,复制列表初始化在概念上不构造临时的。
一个例外是当CCD_ 10是类型CCD_。在这种情况下,#1等效于 *你必须写一些非常折磨人的代码才能解决这个问题。例如: Pre-CWG1467,第1行格式错误,因为过载分辨率选择x
2(即,直接初始化),#2等效于Foo foo = x;
(即,复制初始化struct X
{
X() = default;
explicit X(X&);
X(const X&);
};
int main() {
X x1;
X x2 = {x1}; // #1
X x3 = x1; // #2
}
X(X&)
,即explicit
。在CWG1467之后,explicit
构造函数X(X&)
没有被考虑,所以使用了X(const X&)
。注意,线#2总是良好地形成并且使用CCD_ 19
相关文章:
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在 assert() 和 static_assert() 之间调度,如果在 constexpr 上下文中依赖?
- 如果我的容器位于两个现有值之间,那么伪造迭代器类别是否合理
- #define DATA 10 和 # (如果定义了 DATA)之间的差异
- 如果我在下面的代码中使用 list 而不是 vector,为什么在我尝试在迭代器之间执行减法的行中编译失败?
- 如果检查和内联条件之间是否存在编译器差异
- 如果两个线程调用同一个函数,但函数中的所有变量都是局部变量,我还需要担心线程之间共享数据吗?
- 如果值来自成员变量,则复制初始化和参考初始化之间的C 差异
- 如果 strlen 在 char 数组之间遇到空格,它会怎么做
- 重命名两个目录中的文件名,如果它们之间的某些字符匹配 - 矢量下标超出范围
- 如果 2 个数字之间的差值在 1 到 100 之间,则应运行 if 语句
- 如果用像素来给出两条线(外部和内部)之间的边缘(外部和内部)之间的边缘,则如何计算(x,y)坐标
- 对于数据成员,如果包含对象已在动态内存中,则动态分配此变量(或不动态分配)之间是否有任何区别
- 如果和同时中断之间的区别
- 如果"foo"是引用变量,[&foo]{ ... } 捕获和 [foo]{ ... } 捕获之间有区别吗?
- C++数组运算符和 *(数组 + 索引)之间有什么区别(如果有)
- ShellExecute和CMD命令之间有什么区别,如果有的话
- {x} 和 '= {x}' 初始化之间有什么区别(如果有的话)?
- c ++:TCP服务器"bind"功能失败(errno 98),如果我在两次连续应用程序启动之间没有等待足够的时间
- c ++ 如何提取单词之间的空格(如果有)