Определение двух переменных: «Тип a (arg), b (arg);» полностью эквивалентен «Type a (arg); Type b (arg); ”?

Предположим, я хочу определить две переменные класса {Type}. Конструктор принимает 1 аргумент. Полностью эквивалентны следующие два способа (компиляция в один и тот же объектный код)?

Type a(arg), b(arg);

и

Type a(arg);
Type b(arg);

Этот вопрос возникает после того, как я прочитал страницу, посвященную безопасности исключений --- http://www.gotw.ca /gotw/056.htm Существует рекомендация: «Выполняйте каждое выделение ресурсов (например, новое) в собственном операторе кода, который немедленно передает новый ресурс объекту-менеджеру». Это дает пример: Следующий фрагмент безопасен

auto_ptr t1( new T );
auto_ptr t2( new T );
f( t1, t2 );

Но строка ниже небезопасна

f( auto_ptr( new T ), auto_ptr( new T ) );

Итак, как насчет

auto_ptr t1( new T ), t2( new T );
f( t1, t2 );

Я просмотрел документ стандарта языка C ++, но не нашел ничего, указывающего на эту проблему.

Чтобы замутить воду, как насчет

shared_ptr t1( new T );
shared_ptr t2( t1 );

и

shared_ptr t1( new T ), t2( t1 );

9
задан updogliu 14 December 2011 в 12:20
поделиться