boost :: container :: vector无法使用C ++ 03编译器进行编译

时间:2012-10-26 08:25:24

标签: c++ boost c++11

以下示例在使用带有--std = c ++ 0x标志的GCC 4.4.6时编译正常,但无法在C ++ 03模式下编译。

#include <stdint.h>
#include <boost/container/vector.hpp>

struct data
{
   int               i_;
   boost::container::vector<data>      v_;
};

int main( int argc, char** argv )
{
    data myData;
    myData.i_ = 10;

    data myData2;
    myData2.i_ = 30;

    myData.v_.push_back( myData2 );

    return 0;
}

使用

成功编译
 g++ --std=c++0x test-cont.cpp

但是,如果删除--std=c++0x,我会收到以下错误:     g ++ test-cont.cpp     在包含的文件中       包括/ C ++ / 4.4.6 /存储器:49,       升压/容器/ container_fwd.hpp:36,       升压/容器/ vector.hpp:20,       来自test-cont.cpp:2:

include/c++/4.4.6/bits/stl_algobase.h: In static member function 
    static _OI std::__copy_move<false, false, std::random_access_iterator_tag>::
        __copy_m(_II, _II, _OI) [with _II = 
            boost::container::constant_iterator<data, long int>, _OI = data*]:

include/c++/4.4.6/bits/stl_algobase.h:397:   instantiated from 
    _OI std::__copy_move_a(_II, _II, _OI) 
        [with bool _IsMove = false, 
                   _II = boost::container::constant_iterator<data, long int>, _OI = data*]

include/c++/4.4.6/bits/stl_algobase.h:436:   instantiated from 
    _OI std::__copy_move_a2(_II, _II, _OI) 
    [with bool _IsMove = false, 
               _II = boost::container::constant_iterator<data, long int>, _OI = data*]

include/c++/4.4.6/bits/stl_algobase.h:468:   instantiated from 
    _OI std::copy(_II, _II, _OI) 
        [with _II = boost::container::constant_iterator<data, long int>, _OI = data*]

boost/move/move.hpp:1147:   instantiated from 
    boost::copy_or_move(I, I, F, 
        typename boost::move_detail::disable_if< boost::move_detail::is_move_iterator<I>, void>::type*) 
        [with I = boost::container::constant_iterator<data, long int>, F = data*]

boost/container/detail/advanced_insert_int.hpp:58:   instantiated from 
    void boost::container::container_detail::advanced_insert_aux_proxy<A, FwdIt, Iterator>::copy_remaining_to(Iterator) 
    [with A = std::allocator<data>, FwdIt = boost::container::constant_iterator<data, long int>, Iterator = data*]

test-cont.cpp:21:   instantiated from here

include/c++/4.4.6/bits/stl_algobase.h:343: error: 
    no match for operator= in * __result = 
        __first.boost::container::constant_iterator<T, Difference>::operator* 
        [with T = data, Difference = long int]()

test-cont.cpp:5: note: candidates are: data& data::operator=(data&)

看起来像boost :: container :: vector需要move语义,我假设在使用c ++ 03编译器编译时会自动使用boost::move

如果我手动修改struct data来定义:

  1. 默认构造函数
  2. 复制构造函数
  3. 指派运算符
  4. 使用BOOST_RV_REF的模拟移动构造函数
  5. 使用BOOST_RV_REF的模拟移动赋值运算符
  6. 示例编译。

    必须为C ++ 03手动添加这些移动/复制构造函数和赋值运算符是很费力的。

    这是boost::container的错误吗?如果是这样,那么向推广社区报告它的最佳方式是什么。

1 个答案:

答案 0 :(得分:3)

这是对C ++ 03(from here)仿真的限制:

  

宏BOOST_COPYABLE_AND_MOVABLE需要定义一个副本   copyable_and_movable的构造函数,其中包含非const参数   C ++ 03编译器:

//Generated by BOOST_COPYABLE_AND_MOVABLE
copyable_and_movable &operator=(copyable_and_movable&){/**/}
  

由于生成了复制构造函数的非const重载,   包含的类的编译器生成的赋值运算符   copyable_and_movable将获得非const复制构造函数重载,   这肯定会让用户感到惊讶。   此限制强制用户定义副本的const版本   在所有持有可复制和可移动类的类中,赋值   在某些情况下可能很烦人

在你的情况下boost::container::vector<data> v_;使用BOOST_COPYABLE_AND_MOVABLE(vector)因此错误。