c++ - 使用 std::tie() 和赋值的评估顺序
问题描述
以下内容有效吗?
template <typename T>
std::pair<T, T> foo(T one, T two) { ... }
std::tie(one, two) = foo(std::move(one), std::move(two));
(假设所涉及的类以有效的方式处理分配给移出对象)。
通过阅读更新后的评估订单提案,我的假设是这是已修复的,但我无法在标准中找到一个准确的参考来验证这一点。有人可以帮忙提供吗?
解决方案
标准中的相关部分可以在[expr.ass]/1中找到,它有
在所有情况下,赋值都在左右操作数的值计算之后和赋值表达式的值计算之前进行排序。右操作数在左操作数之前排序。对于不确定顺序的函数调用,复合赋值的操作是单次求值。
因此,根据this,foo(std::move(one), std::move(two));
将首先评估,离开one
并two
从对象移出一次std::tie(one, two)
评估。 tie
创建引用,因此无法访问从那里移动的对象。然后分配实际上发生意义one
并被two
分配给 viastd::tuple::operator =
并获得返回的任何值foo
。这是合法且定义明确的。
推荐阅读
- r - 仅将时间序列中的 NA 向后替换为有限数量的观测值
- javascript - 如果在 [未定义] 上进行测试
- c# - C# 强制静态字段
- apache-kafka - apache kafka partiton log下Position的值是什么?
- c# - Unity 3D 布料拉伸
- haskell - Karatsuba 算法的分治法
- java - 以编程方式设置锁定超时 Spring Boot JPA
- python - pandas df 在列中选择唯一值并为每个唯一值创建单独的 df
- scala - Scala 错误:类型不匹配;找到:java.util.List[?0] 需要:java.util.List[B]
- c++ - 连接2 QTableWidget中的行选择