【问题标题】:Initializing std::vector with curly braces uses initializer list用花括号初始化 std::vector 使用初始化列表
【发布时间】:2020-05-14 09:33:20
【问题描述】:

当我用花括号替换内括号时,我得到了不同的结果。为什么?

C++11 之后的它们不是等价的吗? (除了防止整数降级) 为什么它会改变结构:

来自std::vector(size_type count, const T& value = T(), const Allocator& alloc = Allocator());

std::vector(std::initializer_list<T> init, const Allocator& alloc = Allocator());

示例

auto th_buckets = std::vector<std::vector<int>>{2, std::vector<int>(5, 0)};

0 0 0 0 0

0 0 0 0 0

auto th_buckets = std::vector<std::vector<int>>{2, std::vector<int>{5, 0}};

5 0

5 0

【问题讨论】:

标签: c++ c++11 vector constructor


【解决方案1】:

不,它们不一样,如果一个类有一个构造函数,它采用 std::initializer_list,即使另一个构造函数适合初始化列表,也会优先调用它。 std::vector 确实有一个,因此第二个示例创建一个包含 [5,0] 的列表,而第二个示例包含一个 [0,0,0,0,0] 的列表。

人们普遍认为他们把这部分搞砸了,对不起!

【讨论】:

  • 我不同意这种混乱。 {} 总是从值列表初始化。 () 总是调用非列表构造函数。简单易懂。
  • 您会遇到这种情况,但实际行为取决于是否存在 std::initializer_list 构造函数。
  • 统一有时不那么统一。当有人忘记了他们的太阳镜并且每个人都不得不这样做时,总是很糟糕。
  • 他们添加了std::initializer_list,这样{} 将始终从值列表进行初始化。如果{} 没有 为向量调用初始化列表版本,那将是一个错误。 {} 应始终从值列表初始化。它是统一的,因为现在{} 可以从值列表中统一初始化 anythign,而不仅仅是 POD。 “统一”并不意味着“总是使用这个构造函数”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
相关资源
最近更新 更多