这段代码发生了什么?调用哪个构造函数以及为什么?

问题描述 投票:0回答:1
#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
,但它失败了,因为它仍然是一个引用)

c++ pointers constructor dynamic-memory-allocation lvalue-to-rvalue
1个回答
0
投票

问题是这段代码能否编译通过,输出会是什么?如果无法编译,为什么不能编译,输出会是什么?

不,它不会如图所示进行编译,因为它正在尝试调用已显式

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)

© www.soinside.com 2019 - 2024. All rights reserved.