这些类定义是否等效?
第一个定义:
class A
{
std::string s;
};
第二个定义:
class A
{
std::string s;
public:
A() : s() { }
~A(){ }
A(const A& AA) : s(AA.s) { }
A(A&& a) noexcept : s(std::move(a.s)) { }
A& operator=(const A& AA){
s=AA.s;
return *this;
}
A& operator=(A&& a) noexcept{
s=(std::move(a.s));
return *this;
}
const A* operator&() const{ return this; }
A* operator&(){ return this; }
};
如果不是,您能给我看一个与第一个等效的类定义,并显式定义A类的所有成员函数吗?
最佳答案
这取决于您对“等效”的定义。
...来自C++14's standard draft n3797(我相信它与主要标准并没有太大不同)。
为了简单起见,在特殊成员函数中,以默认构造函数为例,我们从本节中看到:(重点是我的)
上面的代码并不完全适用于您的代码,不过,进一步的支持证据在
检查自己,还有很多支持的证据……因此,从标准的意义上讲,一旦明确定义了任何特殊的成员函数,它就不同于编译器将创建的函数及其相关的假设。
但最终,代码生成器可能会生成相同的代码。 :-)。只是编译器在编译期间的假设可能不同。
TLDR;
standard(草稿)中还有许多其他段落,在其中隐式定义的特殊成员函数的作用与其相反的作用(在此方面几乎保持沉默)之间是有区别的。您可以选择标准并搜索所有出现的短语“隐式定义”