【问题标题】:On Exception-Safety in a Function-Call函数调用中的异常安全
【发布时间】:2011-01-19 08:39:51
【问题描述】:

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());
}

换句话说,如果第一个和第二个auto_new() 函数调用是内联的,那么这两个函数调用的原子性有什么区别吗?

【问题讨论】:

  • 什么让你困惑? inline?
  • 是的,它是 inline 关键字。这意味着函数的主体可以就地替换,我想这会使代码在原子性方面看起来不那么可靠。
  • @wilhelmtell:唯一在您将函数内联时发生的强制更改是对一个定义规则的更改。其他一切都可能保持不变。
  • @CharlesBailey 是的,但您可以从中推断出很多。如果编译器跨编译单元看到主体,则意味着它可以在其他情况下无法内联代码。但这与问题无关。
  • 我不确定我是否理解你的意思。最初您似乎认为inline 可能会以其他方式改变语言规则,我只是想弄清楚实际发生变化的规则。编译器可以做很多事情,但不能在他们喜欢的时候合法地任意无视语言规则。

标签: c++ function-call exception-safety


【解决方案1】:

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

【讨论】:

  • @wilhelmtell:我无法提供负面参考。如果使函数inline 影响函数调用中的序列点,则标准必须在某处声明。我 99% 确定它没有(我的搜索可能失败了!)但我不能引用整个事情来支持我的断言。
猜你喜欢
  • 2015-05-08
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
相关资源
最近更新 更多