C ++样式:运算符重载,通过<flavor>传递

时间:2016-05-11 14:06:35

标签: c++ c++11 c++14

我最近的代码审核收到了以下评论:

  

尽可能避免使用运算符重载:如果使用   为清晰起见,std :: string使用.append()和.assign()而不是+和=

     

避免传递值或引用,而是使用[C style]指针

这不是我第一次遇到这种特殊审稿人的这种废话。

与动物农场一样,有些人比其他人更平等。如何让老板知道他的宠物在同行评审中没有价值?

引用最佳实践的章节和经文是答案的一部分,但我需要的不仅仅是技术原因(不依赖于广告同性恋攻击,可能会令人满意)。建议表示赞赏。

2 个答案:

答案 0 :(得分:3)

问题的两个部分实际上都有客观原因,所以我不同意接近的选票。

对于第一个,std::sort(通过std::less)假设您已超载operator<std::ostream假设您重载了自由函数operator<<(std::ostream&, Foo)std::accumulate假设operator+等等。简而言之,C ++标准本身假定您将使用运算符重载。

在传递值(T, T&, T&& and T*)的4种方法中,最后一种是最差的。它打破了移动语义,临时性,增加了内存泄漏的风险(模糊的语义),并且再次与C ++标准中的假设不兼容。例如。复制构造函数无法获取T*

答案 1 :(得分:1)

幸运的是,整个标准草案以HTML格式提供,可直接链接到每个部分。如果std::string::assignstd::string::operator=完全相同,那将是微不足道的。

21.3.1.6.3 string::assign

basic_string& assign(const basic_string& str);

     Effects: Equivalent to *this = str

21.3.1.2/19 string.cons

basic_string& operator=(const basic_string& str);

     Effects: If *this and str are not the same object, modifies *this

如果我们在信中实现了这一点,它将如下所示:

basic_string& operator=(const value_type* __s) {return assign(__s);}

其中value_typeTraits::char_typecharstd::string