【问题标题】:Difference between capturing return value by `const auto&` and `auto``const auto&` 和 `auto` 捕获返回值的区别
【发布时间】:2021-03-23 19:39:52
【问题描述】:

我见过像const auto& now = time(nullptr);这样的代码

我认为分配time 返回的右值的目的是延长返回值的生命周期,如GotW post 中所述。但是为什么不使用const auto now = time(nullptr)呢?

这里为什么要延长返回值的生命周期?有什么性能差异吗?

【问题讨论】:

  • 不适用于这种情况,但auto 不会推断引用,因此,当您返回引用的对象并希望避免复制时,这可能只是一个“好习惯”。跨度>

标签: c++ c++11 c++14 rvalue-reference


【解决方案1】:

在所示示例中,没有理由使用引用。有或没有它,sn-p 的行为都是一样的。

一般来说,使用引用来避免产生不必要的副本是个好主意,因此养成使用引用的习惯并没有什么坏处,即使在某些情况下它不会产生影响。

我建议在东边写const。这只是一种偏好,绝对不会改变代码的含义,但更加一致。我会写成:

auto const & now = time(nullptr);

【讨论】:

  • 我知道在 C++17 中复制省略是强制性的,所以如果我理解正确,auto const x = rvalue; 应该始终避免在 C++17 中复制/移动;但是,这是否意味着 OP 可能会遇到一个奇怪的符合 C++14 的编译器来进行复制/移动(即使在所示示例中)?
  • @Enlico 如果我删除const 并使用auto x = rvalue,复制省略在这里可以工作吗?
  • @Enlico 我无法想象任何编译器在这两种情况下都不会生成相同的程序集。在 OP 的代码中,auto 是一个time_t,它可能类似于int,所以它本质上与auto const & x = 42;auto const x = 42; 之间的区别相同,这没什么。此外,复制省略适用于 从函数返回,所以我认为这根本不重要。
  • @llxxee constauto const x = rvalueauto x = rvalue; 之间没有区别。只影响x是否可以修改。
  • @Enlico 我可能是错的,但我认为这只适用于类类型。另一方面,std::time_t 不是 必需 成为非类类型,所以是的,我想可以编写代码,其中两个版本之间存在一些可观察到的差异。不过,它仍然只适用于自己的类型,因此不适用于 OP 的情况。
猜你喜欢
  • 2016-08-02
  • 2021-11-18
  • 2021-09-23
  • 2014-02-17
  • 2012-05-29
  • 1970-01-01
  • 2015-12-07
相关资源
最近更新 更多