gpt4 book ai didi

c++ - boost::addable2 的用法 - 为什么从 operator+ 返回的结果是相反的

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:40 25 4
gpt4 key购买 nike

#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 $

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

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

"Now"+ simple_string() 的结果应该是 NowDefault

最佳答案

问题是对于字符串 operator+ 是不可交换的,但是 boost 实现假定它是可交换的。请参阅 http://www.boost.org/doc/libs/1_32_0/libs/utility/operators.htm#symmetry 处的对称注释了解详情。

编辑:阅读实际的 boost 代码后,我认为我错了。您不能对 operator+ 不可交换的类使用 boost 运算符生成,因为这是 boost 中的隐式假设。您必须自己实现。

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

您可以强制使用不假定对称性的低效代码,如下所示:

...如果您的代码依赖于函数签名或严格的对称行为,您应该在您的用户配置中设置 BOOST_FORCE_SYMMETRIC_OPERATORS。这将强制使用对 NRVO 友好的实现,即使对于未实现 NRVO 的编译器也是如此。

关于c++ - boost::addable2 的用法 - 为什么从 operator+ 返回的结果是相反的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8646891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com