1

要编译此代码:

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 是错误的吗?我应该将它们保留为非常量吗?

4

2 回答 2

3

创建一个std::vector您无法分配的类型是未定义的行为。您不能将 POD 分配给const成员。

于 2012-10-22T16:56:55.333 回答
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 是错误的吗?

是的,它与您的预期用途相矛盾。您打算将它们放入一个向量中,在那里它们将被修改。

我应该将它们保留为非常量吗?

是的。如果将它们保留为非常量,则不需要用户定义的复制构造函数,也不需要用户定义的赋值运算符。

于 2012-10-22T17:07:59.857 回答