C++ 向量成员初始化

Zac*_*ack 13 c++

vec我对以下程序中有关in的输出感到困惑Test。为什么它是一个大小为 100 而不是 1 的向量?我以为std::vector<T> var{a}是一样的std::vector<T> var = {a}

#include <iostream>
#include <vector>

using namespace std;
struct Value {
   int a;
   int b;
};

class Test {
  public:
    std::vector<struct Value> vec{100};  
};

class Test2 {
  public:
    std::vector<int> vec{100};  
};

int main()
{
    Test test;
    std::cout << "test size: " << test.vec.size() << std::endl;
    Test2 test2;
    std::cout << "test2 size: " << test2.vec.size();
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

test size: 100
test2 size: 1
Run Code Online (Sandbox Code Playgroud)

Fra*_*eux 11

std::vector有一个带参数的构造函数std::initializer_list<T>。当使用像这样的初始化列表时,{100}如果适用的话,构造函数将始终具有优先级。

对于 a 来说std::vector<int>,初始化器{100}是兼容的,std::initializer_list<int>因此将使用构造函数。它将创建一个包含集合的向量,该集合是具有值的{100}单个向量。int100

因为std::vector<Value>初始化器{100}与参数不兼容std::initializer_list<Value>Value没有用于将 an 转换int为 a 的转换构造函数Value,因此您无法构造std::initializer_list<Value>from {100}您可以通过此示例验证是否不允许进行此转换。编译器将尝试采用优先级较低的构造函数,并使用初始化 100 个默认构造函数的构造函数Value

如果您添加Value::Value(int)构造函数或用作{{100}}初始化程序,Test2您会发现std::vector<Value>现在仅包含单个元素。在这两种情况下,初始值设定项列表都是可转换的std::initializer_list<Value>,并且现在将使用该构造函数。

  • 啊,C++。时刻准备好咬住你的脚踝。 (6认同)