3

当使用带有 C++11 的类成员初始化功能的 std::vector 的填充构造函数(任一形式)时,以下代码无法编译(在 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
}

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

4

2 回答 2

7

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

T t{args}; // 1

或者

T = t{args}; // 2

或者

T = t(args); // 3

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

另请注意,for std::vectorform1可能会导致一些令人惊讶的行为,因为初始化列表构造函数优先。所以

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

不一样

std::vector<int> v = std::vector<int>(1, 2); // 1 element: 2
于 2015-07-27T22:12:21.617 回答
2

知道我错过了什么吗?

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

使用卷曲,或=

struct Foo
{
  std::vector<char> buf_ = std::vector<char>(10);
  std::vector<std::vector<char>> buf2_{10, std::vector<char>(20)};
};

相关的语法产生是一个大括号或相等初始化器,它的名字中有一个线索。:)

于 2015-07-27T22:13:28.537 回答