c++ - 模板函数重载决议

标签 c++ templates overloading

考虑这段代码:

#include <iostream>

void    func(int&)
{
  std::cout << "mutable" << std::endl;
}

void    func(const int&)
{
  std::cout << "const" << std::endl;
}

template<typename T>
void    tpl_func(T&)
{
  std::cout << "mutable_tpl" << std::endl;
}

template<typename T>
void    tpl_func(const T&)
{
  std::cout << "const_tpl" << std::endl;
}

class number
{
public:
  operator int&()
  {
    return nb_;
  }

  operator const int&()
  {
    return nb_;
  }

private:
  int   nb_ = 42;
};

int     main()
{
  number n;

  func(n);     // This produces: error: call to 'func' is ambiguous
  tpl_func(n); // This compiles fine
}

使用 clang3.5 测试

问题:

  • 为什么模板函数的重载决议没有歧义?
  • 什么规则决定选择哪个重载?

最佳答案

因为在 func(n)有一个隐式函数调用(int 转换运算符)是不明确的(您可以选择两者中的任何一个)并且在 tpl_func(n) 中你不是 int 转换,即模板推导为 tpl_func<number>(number &)n是左值。

关于c++ - 模板函数重载决议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26512477/

相关文章:

c++ - 仅从一个模板参数查找特定模板。是否可以?

c++ - 变量作为 C++ 模板的参数

C++ 重载函数和函数模板 - 不同的行为?

java - Java 中的模糊重载

java - 重载枚举抽象方法

c# - 将 printf C++ 控制台输出重定向到 C#

c++ - 为贝塞尔曲线中的每个点绘制切线

c++ - 关于C++中的构造函数和赋值运算符

c++ - Qt - 编写一个多 TCP 服务器程序

c++ - io 用于 std::string 的非关联容器