boost :: log :: record_view赋值运算符

时间:2015-08-10 13:37:45

标签: c++ boost boost-log

#include <boost/log/core/record_view.hpp>

struct A
{
   boost::log::record_view view;
};

int main()
{
   const A a = {};
   A b;
   b = a;

   const boost::log::record_view r;
   boost::log::record_view rr;
   rr = r;
}

第二个是编译的,而第一个不是。编译器说,隐式复制赋值运算符的格式为A& A::operator=(A&),但我不知道为什么在这种情况下编译第二个。我当然可以手动编写重载operator =,但我想知道这种行为的原因。

Live example

看起来这个问题只适用于C ++ 98,所以只能在boost中使用移动模拟。

BOOST_COPYABLE_AND_MOVABLE(record_view)

,其中

   #define BOOST_COPYABLE_AND_MOVABLE(TYPE)\
      public:\
      TYPE& operator=(TYPE &t)\
      {  this->operator=(static_cast<const ::boost::rv<TYPE> &>(const_cast<const TYPE &>(t))); return *this;}\

1 个答案:

答案 0 :(得分:0)

也许这会帮助某人,问题是,实际上record_view有3个赋值运算符。 一个是BOOST_COPYABLE_AND_MOVABLE形式的

TYPE& operator=(TYPE &t)\
      {  this->operator=(static_cast<const ::boost::rv<TYPE> &>(const_cast<const TYPE &>(t))); return *this;}\

另外两个是:

/*!
 * Copy assignment
 */
record_view& operator= (BOOST_COPY_ASSIGN_REF(record_view) that) BOOST_NOEXCEPT
{
    m_impl = that.m_impl;
    return *this;
}

/*!
 * Move assignment. Source record contents unspecified after the operation.
 */
record_view& operator= (BOOST_RV_REF(record_view) that) BOOST_NOEXCEPT
{
    m_impl.swap(that.m_impl);
    return *this;
}

由于第二个运算符而编译的第二个代码,其中BOOST_COPY_ASSIGN_REF

   #define BOOST_COPY_ASSIGN_REF(TYPE)\
      const ::boost::rv< TYPE >& \

但只有

时,编译器才会以operator =格式生成const T&

N4296 12.8 / 18.2

  

表示类型为M的X的所有非静态数据成员   (或其数组),每个这样的类类型具有复制分配   运算符,其参数类型为const M&amp;,const volatile M&amp;或者M。

因此,只会检查record_view的第一个赋值运算符。