我看过 Scott Meyers 在 GoingNative2013 “An Effective C++11/14 Sampler”上的演讲,他解释了std::move_if_noexcept
.
所以在我看来,应该有一个std::forward_if_noexcept
也保证异常安全的forward
?为什么标准库中没有这样的东西?还有另一种可能来保证吗?
我看过 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::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));
}
诚然,这其中很多都处于“早期”阶段,因此可能会发生变化。