Да, они эквивалентны. См. C ++ 11, 8/3:
Каждый init-декларатор в объявлении анализируется отдельно, как если бы он
был в объявлении сам по себе 97 .
Сноска 97 довольно длинная, в ней говорится, что T D1, D2, ... Dn;
"обычно" эквивалентен T D1; T D2; ... T Dn;
, за исключением случаев, когда значение T
в последующих декларациях зависит от того, что вы делаете. Приведены два примера:
struct S {};
S S, T; // is not equivalent to:
S S; S T;
auto i = 1, j = 2.0; // is not equivalent to:
auto i = 1; auto j = 2.0;
Но в обоих случаях одной из альтернатив является ошибка, так что это не различие, которое приведет к тому, что вам придется запускать отладчик.
В любом случае, да, auto_ptr<T> t1( new T ), t2( new T );
так же безопасен, как и auto_ptr<T> t1( new T ); auto_ptr<T> t2( new T );
Обратите внимание, что нет гарантии, что эквивалентный исходный код компилируется в один и тот же объектный код, только в том, что он имеет одинаковое значение. В вашем примере объектный код, который содержит отладочные аннотации, будет разумно отличаться с точки зрения номеров строк исходного текста, но компилятор может также вводить неожиданные различия по какой-то неясной причине или вообще без веской причины.