const pod和std :: vector

时间:2012-10-22 16:55:07

标签: c++ vector struct

要编译此代码:

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是不对的?我应该把它们留作非常数吗?

2 个答案:

答案 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,则不需要用户定义的复制构造函数或用户定义的赋值运算符。