gpt4 book ai didi

c++ - 是否允许为标准库类型和内置类型重载 operator+?

转载 作者:太空狗 更新时间:2023-10-29 20:09:22 26 4
gpt4 key购买 nike

当不存在这样的重载时,是否允许重载运算符,例如用于标准库类型和内置类型的组合的 operator+

例如,在默认命名空间或用户定义的命名空间中实现以下运算符是否合法:

std::string operator+(const std::string& s, int right) { ... }

我知道 std:: 命名空间中实现事物有各种限制,但我不清楚是否有任何规则反对上述内容(这是否是个好主意当然是完全不同的事情!)。

最佳答案

For example, is it legal to implement the following operator in the default namespace or a user-defined namespace:

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++ - 是否允许为标准库类型和内置类型重载 operator+?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47443172/

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