为啥要使用引用来获取 *char?当我们使用指针时不使用引用不是更好吗?

Posted

技术标签:

【中文标题】为啥要使用引用来获取 *char?当我们使用指针时不使用引用不是更好吗?【英文标题】:Why use a reference to get a *char? Isn't better to not use references when we are using pointers?为什么要使用引用来获取 *char?当我们使用指针时不使用引用不是更好吗? 【发布时间】:2019-10-04 05:25:01 【问题描述】:

(最后我会有一组问题)当我必须创建一个以指针 const char* 为例的函数时,我从不使用引用,因为我认为使用对 a 的引用没有意义指针。但是在一本书(C++ Primer Fifht Edition)中,作者告诉我们,我们必须创建一个名为 compare 的函数的版本来比较我们的 c 样式字符串,因此我们避免使用通用模板版本

template <>
int compare(const char* const &p1, const char* const &p2)
 return strcmp(p1, p2); 

是的,他实际上是在声明指针是 const。而且,作者实际上写了另一个只接受字符串字面量的函数

template<size_t N, size_t M>
int compare(const char (&)[N], const char (&)[M]);

所以我的问题是:

    他为什么要使用引用来获取指针?复制指针或获取引用同样昂贵,不是吗? 第一个版本不能接受字符串文字吗? 为什么他要为不需要模板参数的函数使用模板?他正试图重载另一个模板函数,这还不够,是吗?

【问题讨论】:

这看起来不像是正确的语法。应该是template &lt;&gt; int compare&lt;something here&gt;,而不仅仅是template &lt;&gt; int compare。第二个可能也应该说compare&lt;something here&gt;,而不仅仅是compare 【参考方案1】:

他为什么要使用引用来获取指针?复制指针或获取引用同样昂贵,不是吗?

我猜是有一个函数模板:

template <typename T>
int compare(T const &t1, T const &t2)  ... 

它在代码库的其他地方使用。

要专门化char const* 的模板,您必须使用:

template <>
int compare(char const* const &p1, char const* const &p2)  ... 
 //         <--  T  -->

第一个版本不能接受字符串文字吗?

是的,可以。

他为什么要为不需要模板参数的函数使用模板?他试图重载另一个模板函数,这还不够,是吗?

这就是专门化函数模板的语法。它可以是函数重载而不是函数模板只有在函数在没有明确指定模板参数的情况下被调用。

如果你定义

int compare(char const* const &p1, char const* const &p2)  ... 

调用者使用compare&lt;char const*&gt;(s1, s2)时不会调用。 当调用者使用compare(s1, s2)时会调用它。

【讨论】:

第一个可以采用字符串文字,但可能不会,因为可能会有更具体的模板实例化它。 最后两个答案很好,但关于第一个:他为什么使用参考? char const* const p1不够吗? @AlexeyAndreikin:这与他们想要专门研究的模板不匹配。 @AlexeyAndreikin,查看关于函数模板专业化的小更新。 好吧,我猜这个引用就在那里,所以它可以像const T&amp; 那样采用右值。给你

以上是关于为啥要使用引用来获取 *char?当我们使用指针时不使用引用不是更好吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要使用 void 指针来取消引用数据类型的变量?

为啥要使用 JSTL?当我们在 JSP 文件中使用带有连接字符串的数据库连接来获取从 servlet 发送的数据时会有啥危害[重复]

为啥打印指针与打印取消引用的指针打印相同的东西?

C语言 | C++万字总结下

为啥我应该在抛出异常指针时使用按引用捕获

指针 分配空间