gpt4 book ai didi

c++ - C++ 命名空间的奇怪行为

转载 作者:行者123 更新时间:2023-12-04 07:15:19 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Argument dependent name lookup and typedef

(4 个回答)


2年前关闭。




这是一些代码,显示了奇怪之处:

namespace ns
{
typedef int int_type;

class classus {
public:
int a = 0;
};

void print(classus c){
printf("a equals %i \n", c.a);
}
void print(int_type a){
printf("a equals %i \n", a);
}
}

int main(int argc, char* argv[])
{
ns::int_type a1 = 2;
ns::classus a2;
ns::print(a1); // this line wont work without explicit ns:: scope
print(a2); // this line works with or without explicit ns:: scope
}

它在 Visual Studio 2017 上构建并运行。Intellisense 也非常满意。

namespace 中包含的类变量似乎会污染该 namespace 范围内的整行。这是错误还是功能?无论哪种方式,是否有一些关于此的文档......还没有找到任何

最佳答案

使您感到困惑的功能称为 ADL(参数相关查找)
来自 cppreference :

Argument-dependent lookup, also known as ADL, or Koenig lookup, is the set of rules for looking up the unqualified function names in function-call expressions, including implicit function calls to overloaded operators. These function names are looked up in the namespaces of their arguments in addition to the scopes and namespaces considered by the usual unqualified name lookup.

Argument-dependent lookup makes it possible to use operators defined in a different namespace.


在您的示例中 a2来自命名空间 ns足以让编译器也考虑 ns找时 print .
您示例中有趣的部分是 int_type也来自 ns , 虽然它只是一个 typedef 和 int未在 ns 中声明.考虑到 typedef 不会引入新类型(而是别名)。所以 a2真的是 int .
PS :这不是 Visual Studio 特有的。任何符合标准的编译器都应该接受发布的代码。

关于c++ - C++ 命名空间的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58802280/

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