【发布时间】:2020-02-02 22:06:29
【问题描述】:
我对“移动”语义有一些含糊之处:我所读到的是,如果类已定义其自己的复制控制成员之一,则移动构造函数或赋值被隐式定义为已删除的函数。但我有这个代码:
int main()
{
struct A {
A() = default;
A(const A&) { cout << "A's cpy-ctor\n"; } // this forces move ctor to be defined as a deleted function
//A(A&&) = default;
//A(A&&) = delete; // if uncomment this line then the line below calling std::move will cause an error(referencing a deleted function).
};
A a = std::move(A{}); // move not available then use copy-ctor instead
std::cout << "\ndone\n";
}
-
如果我取消注释第一个注释行,那么它就可以,因为我已经猜到了:使用复制构造函数而不是 move-ctor,因为它没有明确定义。
但是,如果我取消注释第二条注释行,我会在调用 std::move 时收到编译时错误,抱怨删除的函数。但是为什么编译器不直接使用copy-ctor呢?
defulting 这个 move-ctor 是什么意思?这对函数匹配有何影响?
非常感谢!
【问题讨论】:
-
使用复制构造函数而不是 move-ctor - 你确定吗?
-
@NutCracker:你说不?如果是,请解释一下。
-
看看here,告诉我你看到了什么
标签: c++ copy-constructor move-constructor