Return std::tuple 在 C++11 中包含常量引用

Return std::tuple containing const-reference in C++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();

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

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

#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。它存储一个衰减(裸类型)副本。