gpt4 book ai didi

c++ - 为什么 C++11/14 中的 std::forward 没有 std::move_if_noexcept 对应项?

转载 作者:IT老高 更新时间:2023-10-28 23:20:33 30 4
gpt4 key购买 nike

我观看了 Scott Meyers 在 GoingNative2013 “An Effective C++11/14 Sampler”上的演讲,他解释了 std::move_if_noexcept 的使用。

所以我认为应该有一个 std::forward_if_noexcept 来保证 forward 的异常安全?为什么标准库中没有这样的东西?有没有其他保证的可能?

最佳答案

前向语义已经是有条件的,即它们保留其参数的值类别。另一方面,移动无条件地将其参数的值类别(从左值变为右值)更改为右值(引用),std::move_if_noexcept 获得基于移动构造函数是否不抛出异常的结果值类别,有效地使其成为有条件的。

简而言之,std::forward 不会改变任何东西,它会保留值类别。另一方面,std::move 确实改变了值类别。所以引入std::move_if_noexcept是说如果std::move的改变会导致异常,那么什么都不要改变 ;不要动它。

我认为这里的基本原理也适用于 std::movestd::forward 的所有事物的预期惯用用法。在 Scott 关于“通用引用”、转发和移动的其他演讲之一(可能在 C++ 和 Beyond 2012)中,他非常强调转发的惯用用法,我认为这支撑了很多 std::forward 是以及如何使用它。它也可能像从未考虑过的那样简单。

我认为没有必要,或者至少当 std::forward 生效时需求减少了。

鉴于它可能有一个用例,实现一个不会太难;但我不确定一般用例。可以说,与可能的异常相关的条件以及所需的异常保证应该在执行转发的函数之外进行测试和处理

template <class U, class T>
U wrapper(T&& arg)
{
return U(forward<T>(arg));
}

template <class U, class T>
U method()
{
T t;
// work with t
return wrapper<U>(move_if_noexcept(t));
}

诚然,这其中很多都处于“早期”阶段,因此可能会发生变化。

关于c++ - 为什么 C++11/14 中的 std::forward 没有 std::move_if_noexcept 对应项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25332738/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com