Ответ 1
В большинстве ситуаций два синтаксиса эквивалентны, и один из них выбирает в основном вопрос вкуса. Если вы входите в равномерную инициализацию, я бы предложил:
A a{ A{} };
В противном случае для устранения неоднозначности можно использовать круглые скобки:
A a((A())); // This can't be parsed as a function declaration
Обратите внимание, что есть одна ситуация (очень маловероятная, я должна сказать), где две формы, показанные в вашем вопросе, не эквивалентны. Если ваш класс A
имеет конструктор, который принимает initializer_list<A>
, этот конструктор будет предпочтительнее конструктора копирования, когда используются фигурные скобки:
#include <initializer_list>
#include <iostream>
struct A
{
A() { }
A(std::initializer_list<A> l) { std::cout << "init-list" << std::endl; }
A(A const& a) { std::cout << "copy-ctor" << std::endl; }
};
int main()
{
A a(A{}); // Prints "copy-ctor" (or nothing, if copy elision is performed)
A b{A()}; // Prints "init-list"
}
Вышеуказанная разница показана в этом живом примере.