c++ - 什么时候使用大括号括起来的初始化器?

标签 c++ c++11 initializer-list

在 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};
}

对于我声明的每个变量,我必须考虑我应该使用哪种初始化语法,这会降低我的编码速度。我确定这不是引入花括号的目的。

当涉及到模板代码时,更改语法会导致不同的含义,因此采用正确的方法至关重要。

我想知道是否存在应该选择哪种语法的通用指南。

最佳答案

认为以下可能是一个很好的指导方针:

  • 如果您要初始化的(单个)值是对象的精确值,请使用复制 (=) 初始化(因为那时如果出现错误,您永远不会意外调用显式构造函数,它通常会以不同方式解释提供的值)。在复制初始化不可用的地方,查看大括号初始化是否具有正确的语义,如果是,则使用它;否则使用括号初始化(如果那也不可用,那你无论如何都不走运)。

  • 如果您要初始化的值是要存储在对象中的值列表(例如 vector/数组的元素,或复数的实部/虚部), 如果可用,使用大括号初始化。

  • 如果您初始化的值不是要存储的值,而是描述对象的预期值/状态,请使用括号。例如 vector 的大小参数或 fstream 的文件名参数。

关于c++ - 什么时候使用大括号括起来的初始化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31702244/

相关文章:

c++ - C++ 中 "array of unknown bound of T"的外部声明

c++ - 如何在 new[] 的值初始化中使用变量

c++ - 通过 C++ 中的构造函数初始值设定项列表初始化私有(private)成员数组

c++ - 如何让 Cygwin 上的 gcc 定义 _WIN32?

c++ - 如何在 Linux 和 Windows 上发布 Qt/C++ 应用程序?

c++ - 在 C++ 中创建蛮力算法

c++ - 为什么输出与我预期的不同?

c++ - std::initializer_list<int const> 不能从 std::initializer_list<int> 构造

c++ - 开源 FIX 客户端模拟器

c++ - Intel Inspector XE 2012 警告 #12367 - 传递给 vector::erase() 的迭代器参数切片