删除右值,保留左值引用(是否提供标准类型特征?)

罗密欧

我正在尝试编写一个函数,以std::tuple的形式返回可变参数包装的子集理想情况下,该函数应该没有运行时开销(没有不必要的副本),并且应该允许用户访问lvalue引用并进行修改。

值类型,lvalue引用和const lvalue引用应得到维护。临时对象(rvalue引用)应“转换”为值类型,以避免创建无效的引用(临时对象的引用)。

预期结果示例:

int lr = 5;
const int& clr = lr;

auto t = make_subpack_tuple(lr, clr, 5);

static_assert(is_same
<
    decltype(t), 
    std::tuple<int&, const int&, int>
>{}, "");

// Ok, modifies lr:
std::get<0>(t) = 10;

// Compile-time error, intended:
// std::get<1>(t) = 20;

// Ok, 5 was moved into the tuple:
std::get<2>(t) = 30;

示例不完整的实现:

template<typename... Ts>
auto make_subpack_tuple(Ts&&... xs)
{
    return std::tuple
    <
        some_type_trait<decltype(xs)>...
    >
    (
        std::forward<decltype(xs)>(xs)...
    );
}

我想做的事有意义吗?

是否可以使用标准的标准特征some_type_trait还是应该实施自己的解决方案?

安德烈·纳索诺夫(Andrey Nasonov)

您的解决方案将是

template<typename... Ts>
auto make_subpack_tuple(Ts&&... xs)
{
    return std::tuple<Ts...>(std::forward<Ts>(xs)...);
}

根据模板参数推导规则,参数包Ts...将仅包含cv限定的类型和左值。这个问题中的信息也可能有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在C ++ 14中保留左值引用的同时衰减右值引用类型?

提供左值和右值重载时,是否有办法删除重复的代码?

右值引用绑定到std :: function类型的左值

左值和右值getter,是否可以将其删除?

为什么标准允许左值引用元组分配右值引用元组?

左值到右值引用绑定

右值引用绑定到左值

为什么右值引用类型的模板参数可以绑定到左值类型?

无法将类型的非常量左值引用绑定到类型的右值

返回对const stuct的(指针类型)成员的引用:从左值到右值的转换

关于如何识别右值或左值引用以及是否具有名称规则

右值引用到左值引用-UB?

左值到右值转换是否曾经发生在类类型上?

重载带有返回值的模板推导类型的右值和左值引用及其实现

错误:无法将类型“ bool&”的非常量左值引用绑定到类型“ bool”的右值

错误:无法将“Position&”类型的非常量左值引用绑定到“Position”类型的右值

无法将类型为'int&'的非常量左值引用绑定到类型为'int'的右值

无法将“Node&”类型的非 const 左值引用绑定到“const Node”类型的右值

在应用间接调用时,标准是否要求将指针变量从左值转换为右值?

用`void *`将右值引用绑定到左值

将非常量左值引用绑定到右值

无法将左值绑定到右值引用

为什么此右值引用绑定到左值?

数据成员作为左值引用或右值副本

通过左值引用修改右值的行为是什么?

将右值绑定到左值引用

取消引用右值指针会产生左值吗?

Widget && rhs是左值还是右值引用

返回语句将右值引用绑定到左值?