Когда использовать инициализатор в скобках?

В C ++ 11 у нас есть тот новый синтаксис для инициализации классов, который дает нам большое количество возможностей для инициализации переменных.

{ // Example 1
  int b(1);
  int a{1};
  int c = 1;
  int d = {1};
}
{ // Example 2
  std::complex<double> b(3,4);
  std::complex<double> a{3,4};
  std::complex<double> c = {3,4};
  auto d = std::complex<double>(3,4);
  auto e = std::complex<double>{3,4};
}
{ // Example 3
  std::string a(3,'x');
  std::string b{3,'x'}; // oops
}
{ // Example 4
  std::function<int(int,int)> a(std::plus<int>());
  std::function<int(int,int)> b{std::plus<int>()};
}
{ // Example 5
  std::unique_ptr<int> a(new int(5));
  std::unique_ptr<int> b{new int(5)};
}
{ // Example 6
  std::locale::global(std::locale("")); // copied from 22.4.8.3
  std::locale::global(std::locale{""});
}
{ // Example 7
  std::default_random_engine a {}; // Stroustrup's FAQ
  std::default_random_engine b;
}
{ // Example 8
  duration<long> a = 5; // Stroustrup's FAQ too
  duration<long> b(5);
  duration<long> c {5};
}

Для каждой объявленной мной переменной мне нужно подумать, какой синтаксис инициализации мне следует использовать, и это замедляет мою скорость кодирования. Я уверен, что это не было целью введения фигурных скобок.

Когда дело доходит до кода шаблона, изменение синтаксиса может привести к различным значениям, поэтому важно идти по правильному пути.

Интересно, есть ли универсальное руководство, какой синтаксис следует выбрать?

Ответы на вопрос(3)

Ваш ответ на вопрос