gpt4 book ai didi

c++ - 这里进行的操作的确切顺序是什么?

转载 作者:太空狗 更新时间:2023-10-29 20:36:10 24 4
gpt4 key购买 nike

我有一个函数:

std::string makeMeat() { return "Pork"; }

我在代码中的某处这样使用它:

std::string meat = makeMeat();

我想知道在这行代码上进行的确切操作顺序是什么。假设两种不同的情况:

  1. std::string 没有移动构造函数(仅作为示例)
  2. std::string 有移动构造函数

我猜 makeMeat() 创建了类 std::string 的临时对象。

std::string temp("Pork");

std::string meat 对象被 temp 对象的数据创建并使用复制构造函数初始化之后?

std::string meat(temp);

最后 temp 对象被销毁了吗?

如果没有返回值优化,我认为它会以这种方式发生。如果是会怎样?

最佳答案

字符串直接在meat中构造。不存在具有不同生命周期的临时对象。这称为省略。

这种行为在 C++17 下是强制的,并且在实践中发生在任何相当现代的生产质量的现代编译器中,没有在 C++03 11 和 14 中设置病态构建标志。

在 C++14 及更早版本中,类必须具有移动或复制构造函数才能发生上述情况,否则构建中断。所述构造函数中的任何代码都不会运行。

古老或玩具编译器,或带有病态标志告诉他们不要省略的编译器,可能会生成最多 2 个临时对象并乱用拷贝。这种情况并不有趣,因为病态编译器状态同样可以自由地实现 a+=b; (使用 ab 整数类型)作为for (i from 0 to b)++a;!你应该诚实地认为缺乏省略同样是病态的。

C++ 中的省略是指标准允许的对象生命周期和身份的合并。因此在某种意义上,存在 3 个字符串(函数中的临时字符串、返回值和由返回值构造的值),它们的标识合并为一个具有统一生命周期的对象。

关于c++ - 这里进行的操作的确切顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39633753/

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