Ben*_*idt 12 c++ noexcept perfect-forwarding c++11
我曾经看过斯科特迈尔斯上GoingNative2013谈话'的有效C++ 11月14日采样器’,并解释说,他使用的std::move_if_noexcept
.
所以我认为还应该std::forward_if_noexcept
保证例外安全forward
吗?为什么标准库中没有这样的内容?还有其他可能保证吗?
前向语义已经是有条件的,即它们保留了其参数的值类别.另一方面,此移动无条件地将其参数的值类别(从l值到r值)更改为r值(引用),std::move_if_noexcept
根据移动构造函数获取结果值类别抛出没有例外,有效地使它成为有条件的.
简而言之,std::forward
不改变任何东西,它保留了价值范畴.std::move
另一方面,确实改变了价值类别.因此std::move_if_noexcept
,如果说std::move
改变可能导致异常,那么就不要改变任何东西 ; 不要动它.
我认为这里的理由也进入预定习惯用法的一切事物std::move
,并std::forward
分别.在斯科特关于"普遍引用",转发和移动的其他一次谈话(可能在C++和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));
}
Run Code Online (Sandbox Code Playgroud)
当然,对于很多这种情况来说,它是"早期的",因此可能会发生变化.