了解 C++ 中运算符的范围

Posted

技术标签:

【中文标题】了解 C++ 中运算符的范围【英文标题】:Understanding the scope of operators in C++ 【发布时间】:2013-06-09 16:43:19 【问题描述】:
#include <iostream>

namespace Foo

    class Baz  ;   

    std::ostream& operator<< ( std::ostream& ostream , const Baz& baz )
    
        return ostream << "operator<<\n";
    


int main()

    std::cout << Foo::Baz();

我在Foo 命名空间中定义了一个operator&lt;&lt;。为什么可以从全局作用域调用?

【问题讨论】:

【参考方案1】:

DRTL

编译器可以通过argument-dependent lookup找到用户定义的operator&lt;&lt;

说明

电话

 std::cout << Foo::Baz();

实际上是

的中缀简写
 operator<<(std::cout, Foo::Baz());

因为函数调用是不合格的(即没有任何命名空间前缀或周围的括号),编译器不仅会进行普通名称查找(从本地函数范围向外) ),还可以在参数std::cout 和类Baz 的所有关联命名空间 中查找函数operator&lt;&lt; 的其他重载的参数相关查找(又名ADL) .在这种情况下,这些关联的命名空间是 stdFoo

因此,依赖于参数的查找将找到定义

 std::operator<<(std::ostream&, /* all the builtin types and Standard strings and streams */)
 Foo::operator<<(std::ostream&, const& Baz)

名称查找后,对于所有 std::operator&lt;&lt; 重载,参数推导将失败。这就是为什么重载解析会发现用户定义的Foo::operator&lt;&lt;实际上是唯一的匹配。这就是它被调用的原因。

【讨论】:

@Kolyunya 很高兴能帮上忙!

以上是关于了解 C++ 中运算符的范围的主要内容,如果未能解决你的问题,请参考以下文章

php中运算符的分类及注意事项

无法在 C++ 中重载流提取运算符 (>>)

C++中运算符new和delete的功能分别是啥?

:: c++中模板函数调用前面的范围解析运算符

C++运算符重载函数作为友元函数

C++运算符重载函数作为友元函数