如何在不取消引用指针的情况下返回指针指针值?

How pointer pointee value returned without dereferencing pointer?

本文关键字:指针 情况下 返回 引用 取消      更新时间:2023-10-16

当我阅读C++模板完整指南(David Vandevoorde,Nicolai M. Josuttis)时,我对以下示例感到困惑

此示例是从标题重载函数模板复制的,但我的问题与重载或模板无关。

s1、s2 和 s3 指针如何从 max 函数返回值。 s1、s2 和 s3 包含 char 数组的地址,但是这些地址如何在不取消引用该指针的情况下转换为值?

#include <iostream>
#include <cstring>
#include <string>
// maximum of three values of any type (call-by-reference)
template <typename T>
inline T const& max (T const& a, T const& b, T const& c)
{
return max (max(a,b), c); // error, if max(a,b) uses call-by-value
}
int main ()
{
const char* s1 = "frederic";
const char* s2 = "anica";
const char* s3 = "lucas";
::max(s1, s2, s3); // ERROR
}

代码比较指针指向的地址,而不是指针指向的对象的值。

::max(s1, s2, s3)的例子中,类型Tconst char*,这意味着整个类型是const char* const&的,并且使用<>(max使用引擎盖下的比较运算符)比较哪个指针"指向更大的地址"。

但是这些地址如何在不取消引用的情况下转换为值 指针

如果我理解你所说的"转化为价值"是什么意思。他们不是。该函数只是比较指针的值,即它们存储的地址,这与这些地址处字符串的实际内容完全无关。这里假设 2 参数max实际上是std::max.

如果不是std::max,那么也许他们只是为了演示而调用一个未指定的函数。也许那个未指定的函数确实取消了对指针的引用。我们看不到它,所以我们不知道。您唯一显示的是 3 参数版本。

再看一眼,很明显他们实际上没有使用std::max,或者至少他们没有假设使用std::max

return max (max(a,b), c); // error, if max(a,b) uses call-by-value

请注意注释中的"if"。std::max不使用按值调用,因此如果我们假设std::max,该评论就没有意义。

你有没有检查过这篇文章:为什么max(max(a,b),c)是错误的?我认为这是同一个例子。显然,max的字符串版本在内部进行了取消引用。

相关文章: