12

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

所以在我看来,应该有一个std::forward_if_noexcept也保证异常安全的forward?为什么标准库中没有这样的东西?还有另一种可能来保证吗?

4

1 回答 1

7

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

简而言之,std::forward不会改变任何东西,它保留了值类别。std::move另一方面,确实改变了价值类别。所以std::move_if_noexcept介绍说,如果std::move' 的更改可能导致异常,则不要更改任何内容;不要移动它。

我认为这里的基本原理也适用于所有事物的预期惯用std::move用法std::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));
}

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

于 2014-08-15T19:30:43.287 回答