引用指针和引用重载

时间:2013-05-30 07:08:05

标签: c++

我可以在以下情况下调用foo(const T *&)吗?

#include <iostream>

template <typename T>
void foo(const T*&)
{
    std::cout << "::foo(const T*&) \n";
}

template <typename T>
void foo(const T&)
{
    std::cout << "::foo(const T&) \n";
}

2 个答案:

答案 0 :(得分:4)

您感到困惑的是,const T*&表示对指向const T的指针的引用,而不是对指向T的指针的const引用。

要调用该foo版本,请使用

int main()
{
  const int *iptr = 0;

  foo(i);
  return 0;
}

或者(可能按预期),将函数签名更改为T *const &,即对指向T的指针的const-reference。

答案 1 :(得分:0)

不,你不能使用那个代码,因为有一个隐式转换,你最终会调用foo(const T&amp;)版本。 如果要分离这两种行为,请使用explicit:

template <typename T>
void foo(const T*&)
{
    std::cout << "::foo(const T*&) \n";
}

template <typename T>
void foo(explicit const T&)
{
    std::cout << "::foo(const T&) \n";
}

int main()
{
    int x;
    int *y=&x;
    foo(x);
    foo(y);
    return 0;
}

这样foo(x)将调用foo(const T&amp;),而foo(y)将调用foo(const T *&amp;)