为什么此元组到引用元组 (std::tie) 转换有效?

Why is this tuple to tuple-of-references (std::tie) conversion valid?

本文关键字:元组 tie 有效 转换 std 引用 为什么      更新时间:2023-10-16

我正在制作一个类"std::tie-able"。 该类充当临时对象,根据分配给它的类型提取值。

这对于分配给元组的实现是显而易见的:

// temporary class conversion operator
template<typename... T>
operator std::tuple<T...>() {
return fetch_values<T...>(); // returns tuple<T...>
}
// usage:
std::tuple<int, int> = get_temporary();

但是,该类也应该能够与 std::tie 一起使用。

int a, b;
std::tie(a, b) = get_temporary();

fetch_values需要值类型参数,因此上述内容需要更改,因为 tie 会导致 T... 成为引用类型。为了实现这一点,我最终得到了一种转换为引用元组的附加方法:

template<typename... T>
operator std::tuple<T&...>() {
auto result = fetch_values<T...>(); // returns tuple<T...>
return result;
}

这确实可以编译和工作,但我有几个问题:

  • 它仅在将fetch_values结果存储在result中,然后再返回时进行编译。写入return fetch_values<T...>()时,编译失败并显示no viable conversion from returned value of type tuple<T, T> to function return type tuple<T&, T&>.为什么此解决方法有效?

  • 这首先有效吗?result值存储在std::tie变量中之前是否存活足够长?

显示问题的示例

您的两个代码段都返回悬空指针。

您应该简单地按值返回:

// temporary class conversion operator
template<typename... T>
operator std::tuple<T...>() const {
return fetch_values<T...>(); // returns tuple<T...>
}

使用std::tie进行转换将起作用。