2011-01-19 2 views
3

Является ли звонок 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() вызовы функций, если эти две функции инлайн?

+1

Что с вашей точки зрения? 'Inline'? – sharptooth

+0

Да, это ключевое слово 'inline'. Это означает, что тело функции можно заменить на месте, что, по моему мнению, делает код менее прочным с точки зрения атомарности. – wilhelmtell

+0

@wilhelmtell: _однозначное изменение, которое происходит, когда вы выполняете функцию inline, - это изменения в правиле определения _one_. Все остальное может оставаться совершенно одинаковым. –

ответ

5

Да, это исключение; нет, inline не имеет никакого значения для точек последовательности, гарантированных в вызывающем выражении.

+0

:::: Ссылка? – wilhelmtell

+0

@wilhelmtell: Я не могу предоставить отрицательную ссылку. Если выполнение функции 'inline' повлияло на точки последовательности в вызове функции, стандарт должен был бы указать это где-то. Я на 99% уверен, что это не так (мой поиск, возможно, не удался!), Но я не могу ссылаться на все это, чтобы поддержать мое утверждение. –

+0

Что о статье Херба Саттера https://herbsutter.com/gotw/_102/? –