标准库类型和内置类型允许重载运算符+吗?

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
    }
}

这篇关于标准库类型和内置类型允许重载运算符+吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

error when trying to run an overloaded function with float parameters.(尝试运行带有浮点参数的重载函数时出错。)
C++ lt;lt; operator overloading without friend function(没有友元函数的C++lt;lt;运算符重载)
C++ - How does the compiler decide between overloaded functions with reference types as parameter?(C++-编译器如何决定使用引用类型作为参数的重载函数?)
How can I invoke an overloaded () operator on the keyword this?(如何对关键字this调用重载()运算符?)
How do I denote a pure virtual function in a UML class diagram?(如何在UML类图中表示纯虚函数?)
MPI parallel IO in ASCII format (How do I do it?)(ASCII格式的MPI并行IO(我该怎么做?))