尝试在类成员初始化中使用 vector 的填充构造函数失败。怎么了?

Attempting to use vector's fill constructor in class member initialization fails. What is wrong?

本文关键字:构造函数 填充 失败 怎么了 vector 成员 初始化      更新时间:2023-10-16

当使用std::vector的fill构造函数(两种形式)与c++ 11的类成员初始化特性时,以下代码无法编译(在clang/llvm 3.6下):

#include <vector>
class Foo
{
  std::vector<char> buf_(10); //compiler error!
  std::vector<std::vector<char>> buf2_(10, std::vector<char>(20)); //compiler error!
public:
  void Bar();
};
void Foo::Bar()
{
  std::vector<char> buf3_(10); //OK
  std::vector<std::vector<char>> buf4_(10, std::vector<char>(20));  //OK
}

我已经搜索了向量填充构造函数和类成员初始化的问题,但都是空的。你知道我错过了什么吗?

不允许使用该语法对非静态数据成员进行就地初始化。您需要表单

T t{args}; // 1

T = t{args}; // 2

T = t(args); // 3

原因是为了避免任何看起来像函数声明的东西。

还要注意,对于std::vector形式1可能会导致一些令人惊讶的行为,因为初始化列表构造函数优先。所以

std::vector<int> v{1,2}; // two elements: 1 and 2

不一样
std::vector<int> v = std::vector<int>(1, 2); // 1 element: 2

你知道我错过了什么吗?

有效的语法吗?不知道你在哪里读到这是有效的

使用卷线,或者=:

struct Foo
{
  std::vector<char> buf_ = std::vector<char>(10);
  std::vector<std::vector<char>> buf2_{10, std::vector<char>(20)};
};
相关的语法产物是大括号或等号初始化式,其名称中包含线索。:)