boost::log::record_view 赋值运算符
boost::log::record_view assignment operator
#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 =
,但我想知道这种行为的原因。
看起来问题只出在 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;}\
也许这会对某人有所帮助,问题是,实际上 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 >& \
但是只有在
时,编译器才会以const T&
的形式生成operator =
N4296 12.8/18.2
for all the non-static data members of X that are of a class type M
(or array thereof), each such class type has a copy assignment
operator whose parameter is of type const M&, const volatile M& or M.
因此,只会检查 record_view
的第一个赋值运算符。
#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 =
,但我想知道这种行为的原因。
看起来问题只出在 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;}\
也许这会对某人有所帮助,问题是,实际上 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 >& \
但是只有在
时,编译器才会以const T&
的形式生成operator =
N4296 12.8/18.2
for all the non-static data members of X that are of a class type M (or array thereof), each such class type has a copy assignment operator whose parameter is of type const M&, const volatile M& or M.
因此,只会检查 record_view
的第一个赋值运算符。