过载运算符+ for vector:namespace std

Div*_*oML 0 c++ vector std

我试图重载运算符+和+ = std :: vector,我做的是

namespace std {
    template<class T>
    vector<T> operator+(vector<T> x, vector<T> y) {
        vector<T> result;
        result.reserve(x.size());
        for (size_t i = 0; i < x.size(); i++)
            result[i] = x[i] + y[i];
        return result;
   }
}
Run Code Online (Sandbox Code Playgroud)

但我认为这是不好的做法,因为clang-tidy警告我"修改std命名空间会导致未定义的行为".在为STL类重载运算符时还有其他更好的做法吗?

Lig*_*ica 6

最佳做法是不要这样做.

但如果你真的想要你仍然可以:只是不要把它放在命名空间中std.

并且不要通过值来接受你的论证,除非你故意这样做以便充分利用移动语义(你不是).

  • 按价值取其中一个是合理的. (2认同)
  • 重载不在类型命名空间中的运算符通常是个坏主意.它确实不能很好地工作.并且,你绝对应该使用像std :: vector`这样的廉价移动类型来获取第一个参数.它使'a + b + c + d'非常高效.不是第二个. (2认同)