对临时对象的哪些操作可以防止其寿命延长?

费多

如您所知,在 C++ 中,如果临时对象绑定到本地引用,则临时对象的生命周期会延长到作用域结束。

但是如果使用临时或其他操作执行强制转换会发生什么,例如:

#include <iostream>

struct S
{
    virtual ~S() { std::cout << "~S() "; }
};

struct U : S {};

int main() 
{
    // this temporary is destroyed in this line in GCC, and at the end in Clang
    [[maybe_unused]] auto && u = dynamic_cast<const U&>( static_cast<const S&>( U{} ) );
    std::cout << ". ";
    // this temporary is destroyed in this line in Clang, and at the end in GCC
    [[maybe_unused]] auto && s =  *&static_cast<const S&>( S{} );
    std::cout << ". ";
}

这清楚地看到,us参考相应的临时对象,还是锵和GCC延长只有临时对象之一的寿命,并且不同意哪一个:https://gcc.godbolt.org/z/onWKaq8MG

两个编译器是否都在他们的权利范围内,或者其中一个(或两个)编译器的行为不正确?

songyuanyao

我认为 Clang 是正确的。

在第一种情况下,临时文件生命周期应该延长。

  • 没有用户定义的转换的 const_cast、static_cast、dynamic_cast 或 reinterpret_cast 转换将这些表达式之一转换为泛左值指的是操作数指定的对象,或其完整对象或其子对象(显式转换表达式被解释为作为这些演员的序列),

这里没有发生用户定义的转换,应该延长生命周期。

对于第二种情况,表达式*&...不包括在延长生命周期的情况下,临时应在完整表达式之后立即销毁。

顺便说一句:Gcc 似乎与dynamic_castonly 的行为不同改变dynamic_cast在第一情况下static_castreinterpret_cast或c风格转换寿命得到延长。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

const引用类成员是否可以延长临时对象的寿命?

来自分类Dev

为什么我们可以非常量引用一个临时对象并延长其寿命?

来自分类Dev

延长临时对象的寿命而不复制它

来自分类Dev

使用const引用延长临时对象的寿命

来自分类Dev

延长C ++中临时对象的寿命

来自分类Dev

通过获取对子对象的引用来延长临时对象的寿命

来自分类Java

对象中正在运行的线程是否可以防止在Java中对其进行垃圾回收?

来自分类Dev

C ++中的右值引用可延长临时对象的寿命

来自分类Dev

为什么const引用不能延长通过函数传递的临时对象的寿命?

来自分类Dev

三元运算符,并通过引用常量来延长临时对象的寿命

来自分类Dev

C ++内存模型中的哪些确切规则可以防止在获取操作之前重新排序?

来自分类Dev

迭代器可以防止其LinkedList被垃圾回收吗?

来自分类Dev

延长构造函数外部的QT对象的寿命

来自分类Dev

我可以防止类被非抽象对象继承吗?

来自分类Dev

我可以防止对象被std :: memcpy复制吗?

来自分类Dev

是否可以防止修改对象的特定键值?

来自分类Dev

返回默认构造对象是否可以防止NRVO?

来自分类Dev

代表可以防止对象被垃圾回收吗?

来自分类Dev

通过ref限定符重载运算符以防止临时操作是否合理?

来自分类Dev

返回引用是否也会延长其寿命?

来自分类Dev

有哪些可靠的机制可以防止 CoreData CloudKit 中的数据重复?

来自分类Dev

有哪些正确的GitHub设置可以防止人们提交到master分支?

来自分类Dev

一些带有默认操作的按钮可以提交以防止默认操作

来自分类Dev

编译可以防止什么?

来自分类Dev

我可以修改液晶显示器以防止其进入睡眠状态吗?

来自分类Dev

apk文件的加密是否可以防止黑客对其进行反编译?

来自分类Dev

是否可以延长传递给函数的右值的寿命?

来自分类Dev

为什么PySide的异常处理会延长该对象的寿命?

来自分类Dev

当删除对象时,对象内部的setInterval是否可以防止垃圾回收?

Related 相关文章

  1. 1

    const引用类成员是否可以延长临时对象的寿命?

  2. 2

    为什么我们可以非常量引用一个临时对象并延长其寿命?

  3. 3

    延长临时对象的寿命而不复制它

  4. 4

    使用const引用延长临时对象的寿命

  5. 5

    延长C ++中临时对象的寿命

  6. 6

    通过获取对子对象的引用来延长临时对象的寿命

  7. 7

    对象中正在运行的线程是否可以防止在Java中对其进行垃圾回收?

  8. 8

    C ++中的右值引用可延长临时对象的寿命

  9. 9

    为什么const引用不能延长通过函数传递的临时对象的寿命?

  10. 10

    三元运算符,并通过引用常量来延长临时对象的寿命

  11. 11

    C ++内存模型中的哪些确切规则可以防止在获取操作之前重新排序?

  12. 12

    迭代器可以防止其LinkedList被垃圾回收吗?

  13. 13

    延长构造函数外部的QT对象的寿命

  14. 14

    我可以防止类被非抽象对象继承吗?

  15. 15

    我可以防止对象被std :: memcpy复制吗?

  16. 16

    是否可以防止修改对象的特定键值?

  17. 17

    返回默认构造对象是否可以防止NRVO?

  18. 18

    代表可以防止对象被垃圾回收吗?

  19. 19

    通过ref限定符重载运算符以防止临时操作是否合理?

  20. 20

    返回引用是否也会延长其寿命?

  21. 21

    有哪些可靠的机制可以防止 CoreData CloudKit 中的数据重复?

  22. 22

    有哪些正确的GitHub设置可以防止人们提交到master分支?

  23. 23

    一些带有默认操作的按钮可以提交以防止默认操作

  24. 24

    编译可以防止什么?

  25. 25

    我可以修改液晶显示器以防止其进入睡眠状态吗?

  26. 26

    apk文件的加密是否可以防止黑客对其进行反编译?

  27. 27

    是否可以延长传递给函数的右值的寿命?

  28. 28

    为什么PySide的异常处理会延长该对象的寿命?

  29. 29

    当删除对象时,对象内部的setInterval是否可以防止垃圾回收?

热门标签

归档