使用“使用命名空间 std”引用重叠函数

Sil*_*ash 2 c++

我很清楚这样做的陷阱。例如:

#include <iostream>
#include <tuple>

using namespace std;

//a simple function that returns the index of max and max value of a parameter pack
template <typename...T>
tuple<int, int> max(T... args) 
{
  const int size = sizeof...(args);
  int list[size] = {args...};

  int max_i = 0;
  int max = list[0];

  for (int i = 1; i < size; i++)
    {
      if (list[i] > max)
        {
          max_i = i;
          max = list[i];
        }
    }  
  return std::tuple<int, int>{max_i, max};
}

int main()
{
  int a ,b;
  tie(a, b) = max(10, 20, 30);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的函数的优先级低于 ofstd::max并产生错误。我想知道是否有办法max在声明using namespace std;. 你不用提醒我不要申报。

dfr*_*fri 6

您可以max使用范围解析运算符调用您的特定重载,::以确保执行限定名称查找而不是非限定名称查找:

::max(10, 20, 30);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,重载决议会将您自己的max函数重载视为比命名空间中的重载更好的可行函数std。来自cppreference - 合格查找[强调我的]:

命名空间成员

[...]

命名空间范围内的限定查找N 首先考虑位于 的N所有声明以及位于 的内联命名空间成员中的所有声明N(并且,传递地,在其内联命名空间成员中)。如果没有声明,在该组则认为通过使用-指令指定的所有空间中声明在发现N和所有传递内嵌命名空间的成员N。[...]