调用委托构造函数时避免复制
Avoid copying when calling delegating constructors
具有委托构造函数的类
class A {
A(SomeObject obj, // requires a new copy of the object
int x,
const string& y
) { // additional logic }
A(SomeObject obj, const string& y)
:A(obj, 0, y) {} // will obj be copied?
};
目标用途:
SomeObject obj;
A a1(obj, "first");
A a2(obj, "second");
设计是在执行A
施工时恰好建造一次SomeObject
。 传递obj
是否会导致在委托给另一个构造函数时复制构造另一个SomeObject
? 如果是,我该如何避免它?
是的,obj
在委托给另一个构造函数时被复制:这不是复制 elision 甚至自动移动的允许上下文。
解决方案是将std::move
应用于成员初始值设定项列表中的参数,或者(对于 私有目标构造函数)通过非const
引用接收对象。 其中任何一个都允许(公共)构造函数仍按值接收其参数,就像 C++11 建议一样。
No.它不会从一个构造函数复制到另一个构造函数。您似乎假设一个构造函数将初始化对象,然后将其传递给另一个构造函数,但事实并非如此。请参阅标准中的这句话:
mem-initializer-list 可以使用表示构造函数的类本身的任何类或 decltype 委托给构造函数类的另一个构造函数。如果 mem-initializer-id 指定构造函数的类,它应该是唯一的 mem 初始值设定项;构造函数是委托构造函数,MEM 初始值设定项选择的构造函数是目标构造函数。目标构造函数是通过重载解析选择的。目标构造函数返回后,将执行委托构造函数的主体。如果构造函数直接或间接委托给自身,则程序格式不正确,无需诊断。
这个最小的示例显示Copied
只打印一次:
#include <iostream>
struct Foo {
Foo() = default;
Foo(const Foo&) {
std::cout << "Copied";
}
};
struct A {
A(Foo f, int i) { }
A(Foo f) : A(f, 0) { }
};
int main() {
A a{Foo{}};
}
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用