【发布时间】:2012-04-01 03:55:44
【问题描述】:
过去几天我一直在玩 C++11,但我想出了一些奇怪的东西。
如果我想统一初始化一个int:
int a{5};
但是如果我对 std::vector 做同样的事情:
std::vector<int> b{2};
不构造一个二元素数组,而是构造一个具有一个值为 2 的元素的数组。似乎要获得这种效果,需要更加明确:
std::vector<int> c{{2}};
std::vector<int> d = {2};
但不像 b 的声明 - 这似乎不一致。我见过一些其他的东西达到同样的效果。我要问的是——这种行为是在最终的 C++11 标准中,还是只是在早期实施的草案中?如果是这样,为什么标准委员会会包括这种行为?似乎它违背了统一初始化的全部目的,因为必须记住哪些类具有初始化列表构造函数,并且仅对这些类使用旧的 () 语法而不是 {}。或者完全放弃统一初始化。
这似乎是一个很大的“陷阱”。但它可能有一些我不知道的优点。
编辑:这段代码:
#include <iostream>
#include <vector>
int main() {
std::vector<int> a{2};
for (auto x: a) {
std::cout << x << std::endl;
}
return 0;
}
在 gcc 4.6.2 上输出“2”
【问题讨论】:
-
@ildjarn:我可以在 gcc 上确认这一点,并且由于它有一个初始化列表 ctor,这似乎是正确的做法。
-
我不是 C++11 专家,但我只是参加了有关它的培训课程,我觉得它很合适。
-
@PlasmaHH 我知道这是一个虚假的承诺。但似乎更难记住特定类型是否可以为所有类型提供初始化列表构造函数(也可能会改变),而不是只记住类型的基本“类”(原始、结构、类、枚举等),不应经常更改。
-
@RobertMason:这可能是一个好主意,仅当您指的是初始化列表时才使用 {}
-
@Mooring Duck:但这正是它的作用。这被提升为一个功能。我想要的是,如果他们要实现这样的功能,他们是一致的。如果他们要允许列表初始化调用任意构造函数,那么(恕我直言)他们应该需要双括号来调用初始化列表构造函数以与其他语法保持一致。
标签: c++ c++11 initializer-list uniform-initialization