尝试在 class 成员初始化中使用向量的填充构造函数失败。怎么了?
Attempting to use vector's fill constructor in class member initialization fails. What is wrong?
当使用 std::vector 的填充构造函数(任何一种形式)和 C++11 的 class 成员初始化功能时,以下代码无法编译(在 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
}
我搜索了有关矢量填充构造函数和 class 成员初始化的问题,但没有找到任何内容。知道我错过了什么吗?
不允许使用该语法就地初始化非静态数据成员。你需要表格
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
Any idea what am I missing?
语法正确吗?不确定你在哪里读到的是有效的。
使用卷曲,或=
:
struct Foo
{
std::vector<char> buf_ = std::vector<char>(10);
std::vector<std::vector<char>> buf2_{10, std::vector<char>(20)};
};
相关语法产生式是brace-or-equal-initializer,其名称中包含线索。 :)
当使用 std::vector 的填充构造函数(任何一种形式)和 C++11 的 class 成员初始化功能时,以下代码无法编译(在 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
}
我搜索了有关矢量填充构造函数和 class 成员初始化的问题,但没有找到任何内容。知道我错过了什么吗?
不允许使用该语法就地初始化非静态数据成员。你需要表格
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
Any idea what am I missing?
语法正确吗?不确定你在哪里读到的是有效的。
使用卷曲,或=
:
struct Foo
{
std::vector<char> buf_ = std::vector<char>(10);
std::vector<std::vector<char>> buf2_{10, std::vector<char>(20)};
};
相关语法产生式是brace-or-equal-initializer,其名称中包含线索。 :)