我有一些关于C++移动构造函数的简单问题,但是到目前为止还没有找到一篇专门解释我在下面看到的.
#include <utility>
class A
{
public:
A() {}
A(const A &) { std::cout << "copy Ctor" << std::endl; }
A(A&&) { std::cout << "move Ctor" << std::endl; }
};
int main()
{
A a;
A b(std::move(a));
}输出是
move Ctor如果我显式删除移动构造函数,
// A(A&&) { std::cout << "move Ctor" << std::endl; }
A(A&&) = delete;我有编译错误,
error: use of deleted function ‘A::A(const A&&)’到目前一切尚好。
然后我读到,我认为‘不声明’应该会给出同样的结果,而不是显式删除,
// A(A&&) { std::cout << "move Ctor" << std::endl; }
// A(A&&) = delete;但我得到了这个输出,
copy Ctor现在我很困惑,
A b(std::move(a))是否直接调用复制ctor?这是C++标准的一部分吗?对于常规函数来说,这似乎是正确的--当函数的参数为xvalue时,采用rvalue引用的函数是首选的,而回退则是采用const lvalue reference.。
发布于 2021-05-20 01:03:30
为了使它更容易理解,我将使用一个不相关的示例,在这个示例中,预期的行为可能会更清楚一些。
与删除常规函数没有太大不同:
struct A
{
void f(int i) {}
void f(double d) = delete;
};
A a;
a.f(1.1); // Error如果我们注释掉第二个重载,那么第一个将被使用。
很明显,它是一种有意的行为,因为删除函数的目的是确保它不被调用(如果它比另一个重载更匹配的话)。
因此,在我上面的示例中,可以很容易地防止发生一些不希望发生的转换。
在需要公共访问时,Thyis与将函数设置为私有没有太大不同。删除函数有一个额外的好处,即不能从类成员函数中使用它。另一个好处是错误发生在编译时,而不是链接时间。
https://stackoverflow.com/questions/67612386
复制相似问题