gpt4 book ai didi

c++ - 对 C++ 中的 namespace 和参数相关查找感到困惑

转载 作者:行者123 更新时间:2023-11-28 02:06:48 26 4
gpt4 key购买 nike

我一直在通读 Bjarne Stroustrup 撰写的 The C++ Programming Language 中的命名空间章节,并对如何使用参数相关查找调用函数感到困惑。以下是书中的代码片段:

片段 1

namespace Chrono {
class Date { /* ... */ };

bool operator==(const Date&, const std::string&);

std::string format(const Date&); // make string representation
// ...
}

void f(Chrono::Date d, int i)
{
std::string s = format(d); // Chrono::format()
std::string t = format(i); // error: no format() in scope
}

这段代码对我来说很有意义,因为 Chrono 是函数 f 的参数中使用的命名空间,因此可以成功地搜索 format(Date) 函数。它还显示函数 f 和命名空间 Chrono 共享相同的范围,这让我对下一个片段感到困惑:

片段 2

namespace N {
struct S { int i };
void f(S);
void g(S);
void h(int);
}

struct Base {
void f(N::S);
};

struct D : Base {
void mf();
void g(N::S x)
{
f(x); // call Base::f()
mf(x); // call D::mf()
h(1); // error: no h(int) available
}
};

直到“h(1);”这行对我来说都是有意义的既然结构体和命名空间 N 共享相同的作用域,为什么在命名空间 N 中找不到函数“void h(int)”?

Stroustrup 确实继续说“如果参数是命名空间的成员,则关联的命名空间就是封闭的命名空间。”由于 g 的参数是命名空间 N 的成员,这是否意味着封闭的命名空间是不包含函数“h(int)”的全局命名空间?如果是这样的话,如果封闭的命名空间是也不包含“格式(日期)”函数的全局命名空间,为什么代码段 1 不会失败?

在此先感谢您对此事的深入了解!

最佳答案

ADL 的应用基于调用本身的参数类型,而不是调用可能在也可能不在的函数的参数类型。

format(d) 中,formatChrono 中查找,因为该调用的参数 d,属于 Chrono::Date 类型,Chrono 是该类型的关联命名空间。包含调用的函数是 void f(Chrono::Date d, int i) 还是 void f() 是无关紧要的。 (显然,在后一种情况下,假设有一个 Chrono::Date d;。)

关于c++ - 对 C++ 中的 namespace 和参数相关查找感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37151092/

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