#include <iostream>
class A {
public:
A() { std::cout << "1"; }
A(const A& s) = delete;
A(A&& s) : a(9) { std::cout << "2"; }
~A() { std::cout << a; }
private:
int a=8;
};
void foo(const A& ina) {
A newA(std::move(ina));
}
int main() {
foo(*new A());
return 0;
}
问题是这段代码能否编译通过,输出会是什么?如果无法编译,为什么不能编译,输出会是什么?
我不知道是否允许写
*new A()
,也不知道是否允许A newA(std::move(ina));
。
有人可以向我更好地解释一下,并告诉我正在调用哪个构造函数吗?
(我期望它是
const ref
构造函数,因为按照我的逻辑,std::move()
尝试从变量 ina
创建右值,这是一个 const ref
,但它失败了,因为它仍然是一个引用)
问题是这段代码能否编译通过,输出会是什么?如果无法编译,为什么不能编译,输出会是什么?
不,它不会如图所示进行编译,因为它正在尝试调用已显式
delete
'd: 的构造函数
main.cpp: In function ‘void foo(const A&)’:
main.cpp:15:26: error: use of deleted function ‘A::A(const A&)’
15 | A newA(std::move(ina));
| ^
main.cpp:6:5: note: declared here
6 | A(const A& s) = delete;
| ^
我不知道是否允许写
*new A()
是的,技术上是允许的。您正在
new
'ing 一个对象,然后取消引用返回的指针。但是,在这种情况下,您正在产生内存泄漏,因为您没有delete
'操作您A
'd的new
对象。
我也不知道是否允许
。A newA(std::move(ina));
不可以,因为您无法移动
const
物体。如果从 const
参数中删除 ina
,则代码将编译,输出将为 129
。
有人可以向我更好地解释一下,并告诉我正在调用哪个构造函数吗?
从错误消息中,您可以清楚地看到它正在尝试调用
delete
的复制构造函数:A::A(const A& s)