提问人:SoulfreezerXP 提问时间:3/11/2023 更新时间:3/13/2023 访问量:72
C++ 隐式声明的移动赋值运算符调用基类的隐式声明的复制赋值运算符
C++ implicitly declared move assignment operator calling implicitly declared copy assignment operator of base class
问:
一个简单的问题,但我找不到证明这一点的规则集 下面的代码示例的行为是正确的。这里似乎只有 strDerived 是 从 b 移动,但 strBase 被复制了?将隐式声明的移动赋值运算符 of Derived (=> 规则为零) 始终调用隐式声明的复制赋值 当 Base 在那里找不到任何移动分配运算符时,它运算符? 这有保证吗?(在示例中执行 move-construction 而不是 move-assignment 时,是否同样适用?
#include <string>
struct Base
{
~Base() = default;
std::string strBase{ "Base"};
};
struct Derived : public Base
{
std::string strDerived{ "Derived" };
};
int main()
{
Derived a, b;
a = std::move( b );
return 0;
}
答:
1赞
Davis Herring
3/12/2023
#1
当然:这是包含 C++03(因此仅复制)类作为(成员或基)子对象的 C++11 类的回退。显然,早期版本的规则会破坏显式默认的移动构造函数,但这早已得到修复:在当前草案中,[class.copy.ctor]/10.1 仅指重载解析失败,而不是特定的相应特殊成员函数。
评论
0赞
SoulfreezerXP
3/13/2023
您能否在本文档中向我展示它在哪里被修复/提及?它必须在§15.8.2中,对吧?open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf
0赞
SoulfreezerXP
3/14/2023
也许是§15.8.1(8.4)中的以下注释: 注意:当移动构造函数未隐式声明或显式提供时,否则将调用移动构造函数的表达式可能会改为调用复制构造函数。对此,你怎么看?这是正确的参考,还是需要在这里的不同上下文中解释?
1赞
Davis Herring
3/14/2023
@SoulfreezerXP:这个注释当然是相关的,尽管它只是解释了某些默认移动构造函数的行为,而不是给它们提供这种行为(或者更确切地说,解释它是如何给出的)。
0赞
SoulfreezerXP
3/14/2023
好的,我会等待更多的答案,如果没有人再补充什么,那么你的答案可能是最正确的,我会相应地标记它。然而,整件事对我来说并不令人满意。
评论