为什么在移除“移动构造函数”的同时使用“复制构造函数”?
Why `copy constructor` is used while `move constructor` has been removed?
作为主题,相关代码为:
#include <iostream>
class ABC
{ public:
ABC()
{
std::cout<< "default construction" << std::endl;
}
ABC(const ABC& a)
{
std::cout << "copy construction" << std::endl;
}
ABC(const ABC&& a)
{
std::cout << "move construction" << std::endl;
}
};
int main()
{
ABC c1 = ABC();
return 0;
}
使用 -fno-elide-constructors -std=c++11 输出
default construction
move construction
如果我删除上面的移动构造函数,那么输出是:
default construction
copy construction
为什么 copy construction
可以使用,而 move constructor
已被删除?你看,如果有用户定义的 move constructor
,编译器更喜欢使用 move constructor
.
As per some documentation,compiler provides a default move constructor
.**那么为什么编译器不使用默认值move constructor
?
我是C++的新手。如果能对这个问题有所帮助,我将不胜感激。
As per some documentation,compiler provides a default move constructor
.
让我们看一下一些文档。以下来自cppreference.com.
If [conditions] then the compiler will declare a move constructor as a non-explicit inline public member of its class with the signature T::T(T&&)
.
你是对的。编译器确实在正确的条件下提供了默认的移动构造函数。 但是,这些条件很重要。您似乎知道的第一个条件:不能有用户定义的移动构造函数。这样就只剩下这个条件列表:
- there are no user-declared copy constructors;
- there are no user-declared copy assignment operators;
- there are no user-declared move assignment operators;
- there is no user-declared destructor;
好了。您的用户定义的复制构造函数阻止编译器提供默认的移动构造函数。因此没有移动构造函数可以使用。
作为主题,相关代码为:
#include <iostream>
class ABC
{ public:
ABC()
{
std::cout<< "default construction" << std::endl;
}
ABC(const ABC& a)
{
std::cout << "copy construction" << std::endl;
}
ABC(const ABC&& a)
{
std::cout << "move construction" << std::endl;
}
};
int main()
{
ABC c1 = ABC();
return 0;
}
使用 -fno-elide-constructors -std=c++11 输出
default construction
move construction
如果我删除上面的移动构造函数,那么输出是:
default construction
copy construction
为什么 copy construction
可以使用,而 move constructor
已被删除?你看,如果有用户定义的 move constructor
,编译器更喜欢使用 move constructor
.
As per some documentation,compiler provides a default move constructor
.**那么为什么编译器不使用默认值move constructor
?
我是C++的新手。如果能对这个问题有所帮助,我将不胜感激。
As per some documentation,compiler provides a default
move constructor
.
让我们看一下一些文档。以下来自cppreference.com.
If [conditions] then the compiler will declare a move constructor as a non-explicit inline public member of its class with the signature
T::T(T&&)
.
你是对的。编译器确实在正确的条件下提供了默认的移动构造函数。 但是,这些条件很重要。您似乎知道的第一个条件:不能有用户定义的移动构造函数。这样就只剩下这个条件列表:
- there are no user-declared copy constructors;
- there are no user-declared copy assignment operators;
- there are no user-declared move assignment operators;
- there is no user-declared destructor;
好了。您的用户定义的复制构造函数阻止编译器提供默认的移动构造函数。因此没有移动构造函数可以使用。