引用 const 的模板特化

template specialization taking a reference to const

我正在尝试了解模板专业化的工作原理。 我有以下功能模板:

template <typename T>
void function(const T &t1, const T &t2)
{
    std::cout << "in function template: " << t1 << ", " << t2 << std::endl;
}

现在,我想专门化此函数模板,以防使用指向 const 的指针调用它:

// template specialization
template <>
void function(const char *&t1, const char *&t2)
{
    std::cout << "in compare template specialization: " << t1 << ", " << t2 << std::endl;
}

但是编译器抱怨找不到专门化的函数模板:

In file included from main.cpp:1:0:
template.h:23:5: error: template-id 'compare<>' for 'int compare(const char*&, const char*&)' does not match any template declaration
 int compare(const char *&t1, const char *&t2)
     ^~~~~~~
template.h:10:5: note: candidate is: template<class T> int compare(const T&, const T&)
 int compare(const T &t1, const T &t2)

如果我像这样专门化模板(对指向 const 的 CONST 指针的引用),它会起作用:

// template specialization
template <>
int compare(const char * const &t1, const char * const &t2)  // now the pointer itself is const
{
    std::cout << "in compare template specialization: " << t1 << ", " << t2 << std::endl;
}

我想用const char *Ptr = "hello world"调用函数所以我认为推断参数T是char*,参数是const char *&。

函数模板参数列表中的const不都是低级const吗?

模板不是像宏那样简单的标记替换机制。 const T 这里不是指 "paste me whatever T is into the spot right after the const"。这意味着那里的东西的类型是“const 无论 T 是什么”。对于函数模板,如果将 T 设置为 const char*,则类型 const T& 将是对 const 的引用,无论 T 是什么,即,对本身是 constconst char* 的引用,即 const char * const &。这与 T 是类型定义的名称而不是模板参数没有什么不同,例如:

using T = int*;
const T blub = 42;  // type of blub is int* const, not const int*

因此,

template <>
void function(const char*& t1, const char*& t2);

不是函数模板的有效特化 function。没有 T 可以替换到模板 function 中以获得此签名。如果用 const char* 代替参数 T,即形式 function<const char*>,它的签名将变成

void function<const char*>(const char * const& t1, const char * const& t2);

请注意,如果您想要一个单独的函数来处理

,而不是依赖显式特化
void function(const char*& t1, const char*& t2);

情况下,只需添加这样一个函数并依靠重载来发挥其魔力。通常,当您发现自己正在编写显式函数模板特化时,很可能您真正想要做的可能只是使用重载。另请参阅 Template Specialization VS Function Overloading or this article(旧的,但仍然一如既往地真实)以了解更多信息……