22
|
StoryTeller - Unslander Monica · 技术社区 · 6 年前 |
![]() |
1
6
规则在于 [basic.lval]/9 以下内容:
|
![]() |
2
14
出于兼容性和/或效率的考虑,保证的副本删除有例外。即使在可以保证复制省略的情况下,也可以复制微不足道的可复制类型。你说得对,如果这不适用,那么编译器就可以生成正确的代码,而不必知道
根据 https://timsong-cpp.github.io/cppwp/class.temporary 以下内容:
|
![]() |
3
8
这与拷贝省略无关。这个
|
![]() |
4
1
尽管答案的数量和贴在这条线上的评论的数量(它已经回答了所有 我的 个人问题),我决定张贴一个答案“为我们其他人”。我起初不明白手术的目的,但现在我明白了,所以我想我会分享。亲爱的读者,如果你知道这一切,并且感到厌烦,请继续前进。 @xskxzr和@hvd有效地回答了这个问题,但是@hvd的帖子特别是标准的,并且假设读者知道如何按值返回(以及扩展返回 RVO )很好,我想不是每个人都这样。我以为我做到了,但我遗漏了一个重要的细节(当你仔细考虑的时候,这一点其实很明显,但我还是错过了)。
所以这篇文章主要集中在这一点上,所以我们都能理解为什么(a)OP想知道为什么在编译时会有问题
所以,让我们再看一遍代码。鉴于此(这是合法的,即使是不完全定义的类型):
为什么编译器不能编译这个(我已经删除了
来自gcc的错误消息是:
好吧,首先,接受的答案引用了标准中明确禁止的相关段落,所以没有什么神秘之处。但是,专栏作家(事实上也是评论沃尔特,他很快就知道了)想知道为什么。 一开始我觉得这很明显:调用者需要为函数结果分配空间,它不知道对象有多大,所以编译器处于一个quandry中。但我错过了一个把戏 那个 在于价值回报的运作方式。 现在对于那些不知道的人来说,按值返回类对象的工作方式是调用方为堆栈上返回的对象分配空间,并将指向它的指针作为隐藏参数传递给被调用的函数,然后由该函数构造对象,对其进行操作。
然而
,这个菊花链,所以如果我们有以下代码
那么空间
还是这样?嗯,事实上,是的。 按值返回类对象时,小对象通常作为优化返回到寄存器(或寄存器对)中。在大多数对象足够小的情况下(稍后将详细介绍),编译器可以避免这样做。
但现在,
总之,这就是为什么编译器需要一个完全定义的类型来调用
笔记:
现场演示 here 是的。欢迎对本帖的所有评论,我将尽我所能予以回复。 |
![]() |
Robert E. Brown · 嵌套类的嵌套类的访问权限 6 年前 |
![]() |
YSC · 通过成员指针访问受保护的成员:这是黑客行为吗? 6 年前 |
![]() |
Swift - Friday Pie · 交换数学运算的阶 6 年前 |
![]() |
Acorn · Linux内核的\uu is\u constexpr宏 6 年前 |
![]() |
Acorn · 检测宏中的整数常量表达式 6 年前 |
![]() |
Petr Skocik · 兼容类型并忽略C类型系统中的顶级限定符 6 年前 |