列表初始化的复制消除在C++标准中何处有明确规定?
嘿,关于C++中括号初始化的复制消除规则,咱们直接捋清楚标准里的明确规定:
括号初始化的复制消除规则
C++标准在[dcl.init]/17.6条款里明确了括号初始化场景下的复制消除逻辑:
若初始化表达式为prvalue,且源类型的cv-unqualified版本与目标类相同,则用该初始化表达式直接初始化目标对象。
举个直观的代码例子就能明白这个规则的作用:
T x = T(T(T()));
按照规则,这里不会创建任何中间临时对象,只会直接调用T的默认构造函数来初始化x——那些嵌套的T()构造和本应发生的复制/移动操作都被完全消除了,效率直接拉满。
不过要划个重点:这个复制消除规则只针对括号初始化场景。如果是列表初始化(也就是用{}进行初始化的情况),上述[dcl.init]/17.6的条款并没有覆盖到这类场景,所以不能想当然地认为同样的复制消除逻辑会生效,具体行为得参考其他相关的标准条款来判断。
内容的提问来源于stack exchange,提问作者Oliv
相关产品推荐
相关产品推荐

