行,
您应该始终以简单的步骤考虑问题。
std::vector<typename T>::push_back(args);
需要在向量数据中保留空间,然后将参数的值分配(或复制或移动)到该位置的vector.data()[idx]的内存中。
要了解为什么你不能在成员函数std::vector::push_back中使用你的结构,试试这个:
std::vector<const int> v; // the compiler will hate you here,
// because this is considered ill formed.
格式错误的原因是std::vector类的成员函数可以调用其模板参数的赋值运算符,但在这种情况下,它是一个常量类型参数“ const int ”,这意味着它没有赋值运算符(赋值给 const 变量是没有意义的!!)。具有const 数据成员的类类型也观察到相同的行为。因为编译器会删除默认的赋值运算符,驱逐
struct S
{
const int _id; // automatically the default assignment operator is
// delete i.e. S& operator-(const S&) = delete;
};
// ... that's why you cannot do this
std::vector<S> v;
v.Push_back(S(1234));
但是,如果您想保持意图并用格式良好的代码表达它,那么您应该这样做:
class s
{
int _id;
public:
explicit s(const int& id) :
_id(id)
{};
const int& get() const
{
return _id;
}; // no user can modify the member variable after it's initialization
};
// this is called data encapsulation, basic technique!
// ...
std::vector<S> v ;
v.push_back(S(1234)); // in place construction
如果你想打破规则并强加一个可分配的常量类类型,那么就按照上面的建议去做。