gpt4 book ai didi

c++ - 在 C++0x 中未调用移动构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:56 24 4
gpt4 key购买 nike

请在下面找到我的代码,我曾经调用移动构造函数(代码灵感来自其他站点)并让我知道它有什么问题,我使用的是 GCC 4.5.3

#include <iostream>
#include <vector>

class Int_Smart_Pointer {

int *m_p;

public:
Int_Smart_Pointer() {
std::cout<<"Derfault Constructor"<< std::endl;
m_p = NULL;
}

explicit Int_Smart_Pointer(int n) {
std::cout<<"Explicit Constructor: " << n <<std::endl;
m_p = new int(n);
}

Int_Smart_Pointer(const Int_Smart_Pointer& other) {
std::cout<<"Copy Constructor: "<<std::endl;
if(other.m_p)
m_p = new int(*other.m_p);
else
m_p = NULL;
}

Int_Smart_Pointer(Int_Smart_Pointer&& other) {
std::cout<<"Move Constructor: "<<std::endl;
m_p = other.m_p;
other.m_p = NULL;
}

Int_Smart_Pointer& operator=(const Int_Smart_Pointer& other) {
std::cout<<"Copy Assignment"<< std::endl;
if(this != &other) {
delete m_p;
if(other.m_p)
m_p = new int(*other.m_p);
else
m_p = NULL;
}

return *this;
}

Int_Smart_Pointer& operator=(Int_Smart_Pointer&& other) {
std::cout<<"Move Assignment"<< std::endl;
if(this != &other) {
delete m_p;
m_p = other.m_p;
other.m_p = NULL;
}

return *this;
}

~Int_Smart_Pointer() {
std::cout<<"Default Destructor"<< std::endl;
delete m_p;
}

int get() const{
if(m_p)
return *m_p;
else
return 0;
}

};

Int_Smart_Pointer square(const Int_Smart_Pointer& r) {
const int i = r.get();
return Int_Smart_Pointer(i * i);
}

Int_Smart_Pointer getMove_Constructor() {
return Int_Smart_Pointer(100);
}


int main()
{
Int_Smart_Pointer a(10);
Int_Smart_Pointer b(a);
b = square(a);

std::cout<< std::endl;

Int_Smart_Pointer c(30);
Int_Smart_Pointer d(square(c)); //Move constructor Should be called (rvalue)

std::cout<< std::endl;

Int_Smart_Pointer e(getMove_Constructor()); //Move constructor Should be called (rvalue)


std::cout<< std::endl;

std::vector<Int_Smart_Pointer> ptr_vec;
ptr_vec.push_back(getMove_Constructor());
ptr_vec.push_back(getMove_Constructor());

std::cout<< std::endl;

return 0;
}

输出是

Explicit Constructor: 10
Copy Constructor:
Explicit Constructor: 100
Move Assignment
Default Destructor

Explicit Constructor: 30
Explicit Constructor: 900

Explicit Constructor: 100

Explicit Constructor: 100
Move Constructor:
Default Destructor
Explicit Constructor: 100
Move Constructor:
Move Constructor:
Default Destructor
Default Destructor

Default Destructor
Default Destructor
Default Destructor
Default Destructor
Default Destructor
Default Destructor
Default Destructor

当我们在构造时使用 std::move 时,它​​正在调用移动构造函数。

Int_Smart_Pointer d(std::move(square(c))); //used std::move and Move constructor called
Int_Smart_Pointer e(std::move(getMove_Constructor())); //used std::move works as above

但是即使我们不使用,gerMove_Constructor 和 square 返回值在构造对象时也会变成右值,因为我们找不到地址空间或对它们的引用,

如果我的理解有问题,请告诉我,如果没有,那么为什么不调用移动构造函数。

提前致谢。萨提亚

最佳答案

当按值返回局部变量时,编译器仍然允许像 C++03 中那样省略复制构造函数(返回值优化)。

关于c++ - 在 C++0x 中未调用移动构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7645985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com