C++ boost::addable2的用法-为什么返回运算符+;相反

C++ boost::addable2的用法-为什么返回运算符+;相反,c++,boost,C++,Boost,问题>为什么生成的运算符+(const char*,const simple_string&)没有返回正确的结果 例如,s5的预期结果应该是s5:nowDefaultDefault 而“Now”+simple_string()的结果应该是NowDefault问题在于,对于字符串运算符+是不可交换的,但boost实现假定它是可交换的。有关详细信息,请参见中的对称注释 编辑:在阅读实际的boost代码时,我认为我错了。对于操作符+不可交换的类,不能使用boost操作符生成,因为这是boost中的一个

问题>为什么生成的
运算符+(const char*,const simple_string&)
没有返回正确的结果

例如,
s5
的预期结果应该是
s5:nowDefaultDefault


“Now”+simple_string()
的结果应该是
NowDefault
问题在于,对于字符串
运算符+
是不可交换的,但boost实现假定它是可交换的。有关详细信息,请参见中的对称注释

编辑:在阅读实际的boost代码时,我认为我错了。对于
操作符+
不可交换的类,不能使用boost操作符生成,因为这是boost中的一个隐式假设。你必须自己实施它

基于(我相信)错误阅读文档的原始答案:

您可以强制执行可能效率较低的代码,这些代码不假定对称,如下所示:


…如果代码依赖于函数签名或严格对称行为,则应在用户配置中设置BOOST\u FORCE\u symmetric\u运算符。这将迫使即使对于未实现NRVO的编译器,也要使用NRVO友好的实现。

在阅读文档并同意您的回答后,我的观点是,对于这些非交换情况,简单地实现您想要的运算符将更容易、更清晰,虽然这并不能真正回答问题。
#include <iostream>
#include <string>
#include "boost/operators.hpp"

using namespace std;

class simple_string : private boost::addable1<simple_string,
                              boost::addable2<simple_string, const char*> > 
{
public:
  simple_string() : m_str("Default")
  {}

  explicit simple_string(const char* s) : m_str(s)
  {}

  simple_string(const simple_string& rhs) : m_str(rhs.m_str)
  {}

  simple_string operator+=(const simple_string& rhs)
  {
    m_str += rhs.m_str;
    return *this;
  }

  simple_string operator+=(const char* rhs)
  {
    this->operator+=(simple_string(rhs));
    return *this;
  }

  friend ostream& operator<<(ostream& os, const simple_string& si)
  {
    os << si.m_str;
    return os;
  }

private:
  string m_str;
};

int main(void)
{
  simple_string s1;
  simple_string s2(s1);
  cout << "[before] s2: " << s2 << endl;

  s2 += s1;
  cout << "s2 += s1: " << s2 << endl;

  simple_string s3 = s1 + s2;
  cout << "s3: " << s3 << endl;

  simple_string s4 = s3 + "Why";
  simple_string s5 = "Now" + s3;
  cout << "s4: " << s4 << endl;
  cout << "s5: " << s5 << endl;
  cout << "Now" + simple_string() << endl;
  return 0;
}
~/Documents/C++/boost $ g++ -o p123 p123.cpp
~/Documents/C++/boost $ ./p123
[before] s2: Default
s2 += s1: DefaultDefault
s3: DefaultDefaultDefault
s4: DefaultDefaultDefaultWhy
s5: DefaultDefaultDefaultNow
DefaultNow
~/Documents/C++/boost $