了解调用哪个构造函数
Understanding which constructor gets called
我有一个存储 int 的结构:
struct foo {
int value;
foo(int value) : value(value) {
std::cout << "value constrn";
}
foo(foo const&) {
std::cout << "copy constrn";
}
foo(foo&&) {
std::cout << "move constrn";
}
};
在主方法中,我执行以下操作:
foo bar = foo(foo(foo(42)));
在这一点上,我希望首先调用通常的构造函数,然后多次移动构造函数,因为参数将是一个右值。但是,输出只是"价值构建"。
为什么既不调用复制也不调用移动构造函数,在这个例子中实际发生了什么?
由于 Copy elision,将调用相应的构造函数来直接构造对象,将省略复制/移动构造函数。自 C++17 以来,这种行为是有保证的。
在以下情况下,编译器需要省略 类对象的复制和移动构造函数,即使复制/移动 构造函数和析构函数具有可观察到的副作用:
在初始化中,如果初始值设定项表达式是 prvalue,并且源类型的 cv 非限定版本与 目标的类,初始值设定项表达式用于 初始化目标对象:
T x = T(T(T())); // only one call to default constructor of T, to initialize x
相关文章:
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 减少复制构造函数调用
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在 Google 测试中,我可以从构造函数调用 GetParam() 吗?
- C++ - 从另一个类构造函数调用类构造函数
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 是否可以从移动构造函数调用默认构造函数?
- 在模板生成器模式中分解重复的构造函数调用
- std::atexit 从全局对象的构造函数调用时的排序
- 对构造函数调用的约束
- 编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
- 用构造函数调用填充向量
- 创建指针时是否没有构造函数调用
- 使用 emplace_back 避免移动构造函数调用的最佳方法?
- C++ 抽象类构造函数调用
- 为什么函数参数将带有参数的构造函数调用
- 为什么比“构造函数”调用更多的“解构器”调用
- 将对象传递给函数并不是导致构造函数调用