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%肯定它不会(我的搜索可能失败了!),但我不能引用整个事件来支持我的断言。