相关疑难解决方法(0)

为什么'std :: vector <int> b {2};' 创建一个1元素的向量,而不是一个2元素的向量?

过去几天我一直在玩C++ 11,我想出了一些奇怪的东西.

如果我想统一初始化一个int:

int a{5};
Run Code Online (Sandbox Code Playgroud)

但是如果我对std :: vector做同样的事情:

std::vector<int> b{2};
Run Code Online (Sandbox Code Playgroud)

不构造一个两元素数组,而是一个具有一个值为2的元素的数组.似乎要获得这种效果,需要更加明确它:

std::vector<int> c{{2}};
std::vector<int> d = {2};
Run Code Online (Sandbox Code Playgroud)

但不像b的声明 - 这似乎不一致.我已经看到了其他一些相同的效果.我要问的是 - 这是最终C++ 11标准中的这种行为,还是只是在早期实施的草案中?如果是这样,为什么标准委员会会包含这种行为?看起来它破坏了统一初始化的整个目的,因为必须记住哪些类具有初始化列表构造函数,并且只使用old()语法而不是{}.或者一个人放弃统一初始化.

这似乎是一个很大的"陷阱".但是我不知道它可能有优点.

编辑:此代码:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> a{2};
    for (auto x: a) {
        std::cout << x << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在gcc 4.6.2上输出"2"

c++ initializer-list uniform-initialization c++11

23
推荐指数
2
解决办法
5163
查看次数