我有一个存储int:
的结构struct foo {
int value;
foo(int value) : value(value) {
std::cout << "value constr\n";
}
foo(foo const&) {
std::cout << "copy constr\n";
}
foo(foo&&) {
std::cout << "move constr\n";
}
};
在主要方法中,我执行以下操作:
foo bar = foo(foo(foo(42)));
此时我希望首先调用通常的构造函数,然后多次移动构造函数,因为参数将是一个rvalue。但是,输出只是&#34;值constr&#34;。
为什么不调用复制或移动构造函数以及在此示例中实际发生了什么?
答案 0 :(得分:3)
由于Copy elision,将调用适当的构造函数直接构造对象,将省略复制/移动构造函数。从C ++ 17开始,这种行为就得到了保证。
在下列情况下,编制者需要省略 类对象的复制和移动构造函数,即使复制/移动也是如此 构造函数和析构函数具有可观察到的副作用:
在初始化中,如果初始化表达式是prvalue,并且源类型的cv-nonqualified版本与 目的地的类,初始化表达式用于 初始化目标对象:
T x = T(T(T())); // only one call to default constructor of T, to initialize x