假设我有类型T与U和函数U f(T)和T g(),和我写的表达f(g()).在什么情况下,附近的未序列表达式中的代码可能在之后g但之前执行f?
我理解一个情况是在函数调用中h(f(g()), j()),j可以在任何时候相对于g和执行f.这基本上是唯一的例子,还是其他的?
为动机,所述功能std::make_shared<T>和std::make_unique<T>可用于写更多异常安全代码,如图的由不安全代码此示例http://herbsutter.com/gotw/_102/:
// In some header file:
void f( std::unique_ptr<T1>, std::unique_ptr<T2> );
// At some call site:
f( std::unique_ptr<T1>{ new T1 }, std::unique_ptr<T2>{ new T2 } );
Run Code Online (Sandbox Code Playgroud)
该T2构造可以在后抛出异常T1构造函数,但在之前std::unique_ptr<T1>的构造,从而导致T1被泄露.解决方案是改为编写f( make_unique<T1>(), make_unique<T2>() );.
我发现的所有异常安全性的讨论都std::unique_ptr使用相同的例子.这让我想知道多参数函数中的参数表达式(包括像+和这样的某些运算符 …