c++ -::std::cout 和 std::cout 有什么不同

标签 c++ namespaces

<分区>

有一个简单的代码,包含::操作的不同用法。

namespace test{
    int add(int x, int y){
          return x + y;
    }
}


int main(){
    int x=3, y=5;
    int r = ::test::add(x,y);
    r = test::add(x,y);
}

或者在另一个例子中

::std::cout << "Hello";
std::cout << "Hello";

这些代码的功能(我的意思是 :: before 语句的用法)没有什么不同。那为什么在语句之前使用 (::) 呢?

最佳答案

区别在于一个是全限定名,一个不是全限定名。是否使用完全限定名称在这些示例中没有实际区别。它可以在另一种情况下产生影响。请参阅下面的示例。

要理解这个概念,如果您熟悉限定名称的其他情况,可能会有所帮助。

以 UNIX/LINUX 文件系统为例。路径分隔符是/与分隔符是::的 C++ namespace 相反。文件系统的根目录是/而全局 namespace 是::。根目录下有一个名为 foo 的文件。当前工作目录是根目录。路径/foo 和 foo 之间有什么区别?它们都引用同一个文件,但第一个是绝对的(即完全限定的)而另一个是相对的(不限定的)。现在考虑将工作目录更改为/bar。在此上下文中,相对路径现在指的是/bar/foo,不再指与/foo 相同的文件。

另一个类似的类比是网络。假设您在 bar.org 页面上。网址之间有什么区别http://bar.org/foo , bar.org/foo,//foo,/foo, 和 foo?它们都指代同一个实体。第一个是完全合格的,最后一个是不合格的,其他的都有不同程度的合格。如果您浏览到 bar.org/baz 或者 zap.org,相对 URL 会改变含义,而绝对不会。

C++ 名称查找比这些类似示例更复杂,因为它可以将相对名称与事件 namespace 的父 namespace 相匹配,而文件系统路径和 URL 通常不会。这种差异对您的示例案例没有影响。

此处的一个简单示例对名称进行限定确实有所不同:

int foo = 1;

namespace bar {

int foo = 2;

void baz() {
    std::cout << foo;
    std::cout << ::foo;
}

}

关于c++ -::std::cout 和 std::cout 有什么不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72506834/

相关文章:

c++ - 在 Folly 的无锁 SPSC 队列中使用 std::memory_order_consume

c++ - boost:如何使当前线程休眠直到给定 ptime?

c++ - 如何通过 C++ 连接到 ODBC DSN

c++ - pahole 不显示命名空间中的类

Python - 类型(名称、基础、字典)

c++ - 在 C++ 命名空间中声明但在其外部定义的函数是否保留该命名空间中的类型?

c++ - 不明确的 C++ 编译器错误

c++ - 具有类作用域的动态分配堆栈内存

c++ - 实现嵌套模板化函数

c++ - 使用命名空间c++时变量不明确