Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数调用中的异常安全_C++_Function Call_Exception Safety - Fatal编程技术网

C++ 函数调用中的异常安全

C++ 函数调用中的异常安全,c++,function-call,exception-safety,C++,Function Call,Exception Safety,调用f()异常安全吗 inline std::auto_ptr<C> auto_new() { return std::auto_ptr<C>(new C()); } void f(std::auto_ptr<C> p1, std::auto_ptr<C> p2); // ... { f(auto_new(), auto_new()); } inline std::auto_ptr auto_new(){ 返回st

调用
f()
异常安全吗

inline std::auto_ptr<C> auto_new() {
   return std::auto_ptr<C>(new C());
}

void f(std::auto_ptr<C> p1,
       std::auto_ptr<C> p2);

// ...
{
    f(auto_new(), auto_new());
}
inline std::auto_ptr auto_new(){
返回std::auto_ptr(新的C());
}
空f(标准::自动ptr p1,
std::自动_ptr p2);
// ...
{
f(auto_new(),auto_new());
}

换句话说,如果第一个和第二个函数是内联函数,那么第一个和第二个函数调用的原子性有什么不同吗?

是的,它是异常安全的;不,
inline
对调用表达式中保证的序列点没有影响。

什么让您感到困惑?
inline
?是的,这是
inline
关键字。这意味着函数体可以就地替换,我想这会使代码在原子性方面看起来不那么可靠。@wilhelmtell:当您将函数内联时,唯一强制执行的更改是对“一个定义”规则的更改。其他一切都可能保持不变。@CharlesBailey是的,但从中你可以推断出更多。如果编译器跨编译单元看到主体,那么这意味着,它可以在其他情况下无法内联代码。但这与问题无关。我不确定我是否理解你的观点。起初,您似乎认为
inline
可能会以其他方式更改语言规则,我只是想弄清楚哪些规则确实会更改。编译器可以做很多事情,但是当他们喜欢的时候,不能随意地无视语言规则。@wilhelmtell:我不能提供否定的引用。如果使函数
内联
影响函数调用中的序列点,则标准必须在某个地方声明。我99%肯定它不会(我的搜索可能失败了!),但我不能引用整个事件来支持我的断言。