gpt4 book ai didi

c++ - 什么时候不使用 `auto&&` ?

转载 作者:IT老高 更新时间:2023-10-28 22:03:26 27 4
gpt4 key购买 nike

  auto&& mytup = std::make_tuple(9,1,"hello");
std::get<0>(mytup) = 42;
cout << std::get<0>(mytup) << endl;
  1. 从返回时是否涉及复制/移动(无 RVO)制作元组?
  2. 是否会导致未定义的行为?
  3. 我可以读写通用引用。可以 auto&& var =
    func()
    总是使用而不是 auto var = func() 这样就没有复制/移动?

最佳答案

只有在初始化程序是一个返回短期右值引用的函数调用时才会出现问题。用更少的文字和更多的代码:

// Fine; lifetime extension applies!
auto&& ref = 42;

auto id = [](int&& i) -> int&& { return std::move(i); };
auto&& uhoh = id(42);
// uhoh is now a stale reference; can't touch it!

相比之下,auto uhoh = id(42); 可以正常工作。

在您的情况下,因为 std::make_tuple 返回一个值而不是右值引用,所以没有问题。

我认为真正的危险来自那些带有右值引用参数的函数和函数模板,它们返回一个右值引用,指向生命周期依赖于这些子对象的那些子对象。 (话虽这么说,像 auto&& ref = std::move(42); 这样简单的事情就会出现问题!)

这种情况从 C++11 开始并不是全新的,请考虑:T const& ref = bar(T_factory());

关于c++ - 什么时候不使用 `auto&&` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14849107/

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