要编译此代码:
std::vector<Foo> factory()
{
std::vector<Foo> data;
return data;
}
我必须像这样定义我的POD:
struct Foo
{
const int i;
const int j;
Foo(const int _i, const int _j): i(_i), j(_j) {}
Foo(Foo& foo): i(foo.i), j(foo.j){}
Foo operator=(Foo& foo)
{
Foo f(foo.i, foo.j);
return f;
}
};
这是否是定义pod的正确方法,我不想在创建后更改pod成员?为什么我被迫定义一个复制构造函数并重载赋值运算符?这是否与std::vector
的不同平台实现兼容?你认为拥有像这样的const PODS是不对的?我应该把它们留作非常数吗?
答案 0 :(得分:3)
在您无法分配的类型上创建std::vector
是未定义的行为。您无法为const
成员分配POD。
答案 1 :(得分:0)
你问几个问题:
这是否是定义pod的正确方法,我不想在创建后更改pod成员?
您的问题格式不正确,因为 有兴趣在创建后更改pod成员。使用std::vector
,您要求vector::resize()
,例如,通过赋值运算符修改对象的所有成员的权限。
另外,正如其他人所指出的,你的operator=
没有多大意义。它肯定不会做你认为它做的事情。具体而言,在表达式a=b
之后,a
的成员不会更改。
为什么我被迫定义一个拷贝构造函数并重载赋值运算符?
因为您使用的是std::vector
。考虑C ++ 2003,§23.1/ 3,“存储在这些组件中的对象类型必须满足CopyConstructible
的要求
类型以及Assignable
类型的其他要求。“
实际上,这是因为vector
需要能够在进行内存管理时移动对象。
这是否与
std::vector
的不同平台实施兼容?
是。对于std::vector
的任何实现,您的类型必须是CopyConstructible和Assignable。
你认为拥有这样的const PODS是不对的?
是的,它与您的预期用法相矛盾。您打算将它们放入矢量中,在那里它们将被修改。
我应该把它们留作非常量吗?
是。如果将它们保留为非const,则不需要用户定义的复制构造函数或用户定义的赋值运算符。