为什么 C++ 参数范围会影响命名空间中的函数查找? [英] Why does C++ parameter scope affect function lookup within a namespace?

查看:17
本文介绍了为什么 C++ 参数范围会影响命名空间中的函数查找?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这对我来说似乎有点倒退,但它确实有效:

This seems a little backwards to me but it works:

#include <iostream>

namespace nTest
{
  struct cTest {};

  void fTest(cTest& x)
  {
    std::cout << "nTest::fTest(cTest&) called" << std::endl;
  }
}

int main(void)
{
  nTest::cTest x;
  fTest(x); //Weird! fTest is resolved since its parameter belongs to nTest.
  return 0;
}

通常,您需要 nTest:: 才能访问 fTest,但其属于 nTest 的参数似乎会将 nTest 添加到搜索 fTest 的可能范围列表中.参数范围影响函数查找对我来说似乎很奇怪.

Normally, you would need nTest:: in order to access fTest, but its parameter which belongs to nTest appears to add nTest to the list of possible scopes in which to search for fTest. It seems odd to me that the parameter scope influences the function lookup.

这在 GCC 中编译得很好,但我想知道这种用法是否可移植?这种作用域机制的官方定义是什么?

This compiles fine in GCC, but I'm wondering is this usage portable? What is the official definition of this scoping mechanism?

推荐答案

即 ADL(Argument Dependent Lookup)或 Koenig Lookup(用于功能的设计者).该功能的目的是在许多情况下,相同的命名空间将包含可应用于这些类型的类型和函数,所有这些都符合 接口.如果 ADL 没有到位,您必须使用 using 声明将标识符带入范围,否则您必须限定调用.

That is ADL (Argument Dependent Lookup) or Koenig Lookup (for the designer of the feature). The purpose of the feature is that in many cases the same namespace will contain types and functions that can be applied to those types, all of which conform the interface. If ADL was not in place, you would have to bring the identifiers into scope with using declarations or you would have to qualify the calls.

这变成了一场噩梦,因为该语言允许运算符重载.考虑以下示例:

This becomes a nightmare since the language allows for operator overloads. Consider the following example:

namespace n {
   struct test {};
   test operator+( test, test const & ); // implemented
};
int main() {
   n::test a,b;
   n::test c = a + b;  //without ADL: c = n::operator+( a, b )
}

虽然这看起来很尴尬,但请考虑 n 可能是 std 命名空间,test 可能是 ostream, operator+ 可以是 operator<<:

While it might seem like an awkward situation, consider that n might be the std namespace, test might be ostream, and operator+ could be operator<<:

int main( int argc, char** ) {
   std::cout << "Hi there, there are " << argc << " arguments" << std::endl;
}

如果没有 ADL,对 operator<< 的调用必须是显式的,而且您必须知道它们中的哪些是作为自由函数实现的,而不是作为方法实现的.你知道 std::cout <<"Hi" 正在调用一个自由函数并且 std::cout <<5 是调用成员函数吗?没有多少人意识到这一点,而且说真的,几乎没有人在乎.ADL 对您隐藏了这一点.

Without ADL, the calls to operator<< would have to be explicit, and moreover you would have to know which of them is implemented as a free function versus a method. Did you know that std::cout << "Hi" is calling a free function and std::cout << 5 is calling a member function? Not many people realize it, and seriously, almost no one cares. ADL hides that from you.

这篇关于为什么 C++ 参数范围会影响命名空间中的函数查找?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆