gpt4 book ai didi

c++ - 隐式声明的(对象级)成员函数如何根据 ISO C++11 标准工作?

转载 作者:太空狗 更新时间:2023-10-29 21:38:32 26 4
gpt4 key购买 nike

这些类定义是否等价?

第一个定义:

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 (我相信它与主要标准没有太大区别)..

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

12.1.5: .... Before the defaulted default constructor for a class is implicitly defined, all the non-user-provided default constructors for its base classes and its nonstatic data members shall have been implicitly defined. [ Note: An implicitly-declared default constructor has an exception-specification. An explicitly-defaulted definition might have an implicit exception specification, see 8.4. —end note ]

以上并不完全适用于您的代码,但是,进一步的支持证据位于

12.6.3: A non-explicit copy/move constructor is a converting constructor. An implicitly-declared copy/move constructor is not an explicit constructor; it may be called for implicit type conversions.

自己检查一下,还有更多支持证据...因此,在标准意义上,一旦您显式定义了任何特殊成员函数,它就不同于编译器创建的和其相关假设。

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

TLDR;

标准(草案)中还有很多其他段落,其中区分了隐式定义的特殊成员函数的效果及其相反的效果(对此大多保持沉默)。您可以选择标准并搜索所有出现的短语“implicitly-defined”

关于c++ - 隐式声明的(对象级)成员函数如何根据 ISO C++11 标准工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35256315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com