【问题标题】:Return std::tuple containing const-reference in C++11在 C++11 中返回包含 const-reference 的 std::tuple
【发布时间】:2021-08-26 11:09:11
【问题描述】:

我有这样的东西(C++11)

std::tuple<const MyType&, bool> func()
{
   return std::make_tuple(some_internal_reference, true);
}

问题是在调用者中我不能声明:

const MyType& obj; // this does not compile of course
bool b;

std::tie(obj, b) = func();

一个想法是将布尔值作为输出参数返回并删除元组,但有更好的解决方案吗?

【问题讨论】:

  • 用指针替换引用怎么样?
  • @VictorGubin 这里的问题是参考,而不是const。 std::move 也解决不了任何问题。
  • 使用std::get,它返回一个引用。 auto tup = func(); const MyType&amp; obj = std::get&lt;0&gt;(tup);.
  • std::make_tuple 执行其参数的衰减副本。它不会推断成员的引用。你确定这是减少的问题吗?
  • @Taw - 你的意思是std::make_tuple(std::ref(...)...)?如果您的代码示例准确,它将帮助您获得帮助。 minimal reproducible example 在获得帮助方面大有帮助。是的,std::ref 是让它发挥作用的一种方法。这是改变make_tuple 行为的标准方法。

标签: c++ c++11 stdtuple


【解决方案1】:

使用std::get。它返回对存储元素的引用。

#include <iostream>
#include <tuple>

using MyType = int;
MyType some_internal_reference = 42;

std::tuple<const MyType&, bool> func()
{
    return { some_internal_reference, true };
}

int main()
{   
    auto ret = func();
    const MyType& obj = std::get<0>(ret);
    
    std::cout << "before change: " << obj << '\n';
    
    some_internal_reference = 7;

    std::cout << "after change: " << obj << '\n';
}

打印出来

before change: 42
after change: 7

注意,根据@StoryTeller-UnslanderMonica 的评论,在这种情况下不要使用std::make_tuple。它存储一个衰减(裸类型)副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2012-05-23
    • 2019-12-11
    • 2017-10-13
    • 1970-01-01
    相关资源
    最近更新 更多