0

我可以在以下情况下调用 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";
}
4

2 回答 2

4

您对以下事实感到困惑const T*&:指向 的指针的引用const T,而不是指向 的指针的 const 引用T

要调用该版本的foo,请使用

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

  foo(i);
  return 0;
}

或者(并且可能按照预期),将函数签名更改为T *const &,即对指向 的指针的 const 引用T

于 2013-05-30T07:25:26.013 回答
0

不,您不能使用该代码,因为存在隐式转换,您最终将调用 foo(const T&) 版本。如果要分离这两种行为,请使用显式:

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&),而 foo(y) 将调用 foo(const T*&)

于 2013-05-30T07:29:22.707 回答