为什么不调用移动构造函数?[复制]

Why the move constructor isn't invoked? [duplicate]

提问人:Amir reza Riahi 提问时间:7/22/2022 最后编辑:Amir reza Riahi 更新时间:7/22/2022 访问量:52

问:

我定义了一个同时具有复制和移动构造函数的类。复制构造函数似乎工作正常,但是当我尝试调用移动构造函数时,它不起作用。

#include <iostream>

class A{

        public:
                A() = default;

                A(A& a){
                        std::cout << "Copy constructor." << std::endl;
                };

                A(A&& a){
                        std::cout << "Move constructor." << std::endl;
                };
};


int main(int argc, char *argv[]){

        auto a = A(A());
        
        std::cout << "here" << std::endl;       

        auto b = A(a);

        return 0;
}

我希望应该调用移动构造函数,因为它的输入()是一个.但输出是这样的:auto a = A(A());A()rvalue

[amirreza@localhost tmp]$ ./a.out 
here
Copy constructor.

我的假设错了吗?

我正在使用版本而没有明确指定 c++ 版本。gcc10.3.1

C++ 复制构造函数 move-semantics move-constructor

评论

0赞 Ulrich Eckhardt 7/22/2022
我会说,复制构造函数应该引用。哪一行产生您引用的输出?const
4赞 Drew Dormann 7/22/2022
你的假设是错误的。 允许简单地调用默认构造函数,并且从 C++17 开始,需要省略移动。auto a = A(A());
0赞 Amir reza Riahi 7/22/2022
@UlrichEckhardt 我认为auto b = A(a);
2赞 fabian 7/22/2022
en.cppreference.com/w/cpp/language/copy_elision
1赞 Ulrich Eckhardt 7/22/2022
您能找出是哪条线导致的,并编辑您的问题以澄清吗?另外,您的目标是哪个 C++ 版本?

答: 暂无答案