这些类定义是否等效?

第一个定义:

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类的所有成员函数吗?

最佳答案

这取决于您对“等效”的定义。

  • 代码生成的汇编输出? ,对于一个好的编译器和优化器来说,应该如此。 :-)
  • 生成AST并进行类表示或中间代码时的编译器假设? 没有,为什么?

  • ...来自C++14's standard draft n3797(我相信它与主要标准并没有太大不同)。

    为了简单起见,在特殊成员函数中,以默认构造函数为例,我们从本节中看到:(重点是我的)



    上面的代码并不完全适用于您的代码,不过,进一步的支持证据在



    检查自己,还有很多支持的证据……因此,从标准的意义上讲,一旦明确定义了任何特殊的成员函数,它就不同于编译器将创建的函数及其相关的假设。

    但最终,代码生成器可能会生成相同的代码。 :-)。只是编译器在编译期间的假设可能不同。

    TLDR;

    standard(草稿)中还有许多其他段落,在其中隐式定义的特殊成员函数的作用与其相反的作用(在此方面几乎保持沉默)之间是有区别的。您可以选择标准并搜索所有出现的短语“隐式定义”

    09-10 04:28
    查看更多