gpt4 book ai didi

c++ - 移动构造函数的预期用法没有发生

转载 作者:行者123 更新时间:2023-11-30 01:53:17 27 4
gpt4 key购买 nike

这是我的类(class)和程序:

class A {
public:
int x;
int* v;
A() : x(5), v(new int[5]) {cout<<"default ctor. "; for (int i=0; i<x; i++) v[i]=rand()%10;}
A(const A& a) : x(a.x), v(new int[x]) {cout<<"copy ctor. "; for (int i=0; i<x; i++) v[i]=a.v[i]; }
A(A&& a) : x(a.x), v(a.v) {cout<<"move ctor. ";a.x=0;a.v=0;}
A& f() {return *this;}
A g() {return *this;}
};

int main() {
srand(time(0));
cout<<"A a --> ";A a;cout<<endl;
cout<<"A b(A()) --> ";A b(A());cout<<endl;
cout<<"A c(a.f()) --> ";A c(a.f());cout<<endl;
cout<<"A d(a.g()) --> ";A d(a.g());cout<<endl;
cout<<"A e(A().g()) --> ";A e(A().g());cout<<endl;
}

我希望对象 bde 使用移动构造函数,但是我得到的输出是:

A a --> default ctor.

A b(A()) -->

A c(a.f()) --> copy ctor.

A d(a.g()) --> copy ctor.

A e(A().g()) --> default ctor. copy ctor.

如果在所有三种情况下右值都是构造函数的参数,为什么不使用移动构造函数?

显然我正在使用 -std=c++11 选项进行编译。

最佳答案

使用 b,您已经点击了“most vexing parse”。 b 是函数声明,不是对象。

取表达式

A b(A());

让我们进行一些名称更改和语义保留转换:

int foo(int (*p)());

现在,我认为很明显 foo 是一个函数(返回 int 并将指向 int() 函数的指针作为参数) .现在将 A 替换为 int,将 b 替换为 foo 并记住函数被隐式转换为指向函数的指针.您会发现这是同一件事。

要解决这个问题,您可以使用大括号初始化(感谢@MikeSeymour 指出这一点):

A b{A()};

对于 d,我认为你是 copy elision 的“受害者” . “copy ctor”输出可能来自用 *this 初始化返回值;完全省略了从返回值到 d 的移动。

对于 e,它与 d 是同一个故事。

关于c++ - 移动构造函数的预期用法没有发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23274231/

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