尝试在类成员初始化中使用 vector 的填充构造函数失败。怎么了?
Attempting to use vector's fill constructor in class member initialization fails. What is wrong?
当使用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)};
};
相关的语法产物是大括号或等号初始化式,其名称中包含线索。:) 相关文章:
- 填充上编译器生成的复制构造函数之间的不一致
- 使用所述填充构造函数初始化向量中的向量
- C++:SFINAE 来区分填充和范围构造函数?
- 如何在C++11中区分填充构造函数和范围构造函数
- 用构造函数调用填充向量
- 组合 std::vector 默认值和填充构造函数
- 通用矢量的填充构造函数
- 为什么 C++11 从 std::vector 的填充构造函数的原型中删除了默认值?
- 通过指针填充自定义的类 - 与构造函数的麻烦
- 如何基于构造函数参数填充常量成员数组
- C++:在类构造函数中填充向量后,向量成员被销毁
- 结构错误的构造函数(调用类的构造函数 denconstructor,用于填充结构)
- 为什么从std::string的initializer列表中填充std::向量不会调用std::字符串构造函数
- 异常构造函数来填充字符串流
- 使用派生类构造函数填充基类受保护成员
- 尝试在类成员初始化中使用 vector 的填充构造函数失败。怎么了?
- 将字符串的填充构造函数与初始值设定项列表一起使用
- 用构造函数填充向量的C++奇怪行为
- std::initializer_list构造函数除了用值填充一些容器之外,还有什么用
- 在类的构造函数初始值设定项中填充 std::array