首页 > 解决方案 > 在 C++11 中返回包含 const-reference 的 std::tuple

问题描述

我有这样的东西(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();

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

标签: c++c++11stdtuple

解决方案


使用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在这种情况下使用。它存储一个衰减(裸类型)副本。


推荐阅读