Is it allowed to overload operator+ for a standard library type and a built-in type?(标准库类型和内置类型允许重载运算符+吗?)
问题描述
是否允许在不存在这样的重载操作符时重载运算符,如operator+
用于标准库类型和内置类型的组合?
例如,在默认命名空间或自定义命名空间中实现以下运算符是否合法:
std::string operator+(const std::string& s, int right) { ... }
我知道std::
命名空间中的实现有各种限制,但我不清楚是否有针对上述限制的规则(这是否是个好主意当然完全是另一回事!)。
推荐答案
例如,在默认命名空间或自定义命名空间中实现以下运算符是否合法:
std::string operator+(const std::string& s, int right) { ... }
是的,这样做是完全合法的。唯一的限制是向namespace std
添加名称,或专门化成员函数模板或类模板,或在std
中添加类模板的演绎指南。
没有什么可以阻止您编写类似以下内容的内容:
namespace N {
std::string operator+(std::string s, int ) { return s; }
}
根据标准,这是一个格式良好的程序。但是请注意,由于根据定义,运算符中没有任何程序定义的类型,因此ADL永远也找不到它们。由于它们是运算符,通常由ADL找到,因此这本身可能是避免这种模式的原因:
namespace U {
auto foo() {
return "hello"s + 1; // error: name lookup doesn't find our operator
}
auto bar() {
using namespace N;
return "hello"s + 1; // ok: for some definition of ok
}
}
这篇关于标准库类型和内置类型允许重载运算符+吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:标准库类型和内置类型允许重载运算符+吗?


基础教程推荐
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 设计字符串本地化的最佳方法 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01