4

我正在尝试在 Visual Studio 2008 下编译以下代码:

struct test
{
    boost::container::vector<int> v1;
};
test v1, v3;
const test & v2 = v3;
v1 = v2;

我得到的错误是:
错误C2679:二进制'=':找不到采用'const test'类型的右手操作数(或没有可接受的转换)
的运算符可能是'test &test::operator =(尝试匹配参数列表'(test, const test)'时测试&)'

当使用普通的 std::vector 而不是 boost::container 等效项时,代码会编译。我正在寻找为什么此代码无法编译以及如何使其编译的答案。

4

1 回答 1

5

我发现了一个已经被问过的类似问题: boost::container::vector failed to compile with C++03 compiler

我们观察到的行为似乎是 boost 社区设计并知道的: Boost::move 仿真限制章节“派生自或持有可复制和可移动类型的类中的赋值运算符”。

为了使主要问题中显示的代码能够工作,必须使用 BOOST_COPYABLE_AND_MOVABLE 宏将类声明为可复制和可移动的。复制分配的 const 版本也需要明确定义。C++03 编译器的代码更正版本:

class test
{
private:
    BOOST_COPYABLE_AND_MOVABLE( test );
public:
    test& operator=(BOOST_COPY_ASSIGN_REF(test) p) // Copy assignment
    {
        v1 = p.v1;
        return *this;
    }
    boost::container::vector<int> v1;
};

那些额外的类装饰可能确实会变得烦人,尤其是当代码库很大时。我不想花时间浏览代码并添加分配运算符。

于 2013-01-11T12:31:26.463 回答