如何在没有解除引用指针的情况下返回指针指针值?

时间:2014-03-07 17:51:52

标签: c++

当我阅读 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
}

3 个答案:

答案 0 :(得分:1)

  

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

如果我理解你的意思是“转换为价值”。他们不是。该函数简单地比较指针的值,即它们存储的地址,这与这些地址处的字符串的实际内容完全无关。假设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,则该注释没有意义。

答案 1 :(得分:1)

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

::max(s1, s2, s3)的示例中,T类型为const char*,表示整个类型为const char* const&,并使用<和{{{{}等比较运算符1}}(>使用引擎盖下)比较哪个指针“指向更大的地址”。

答案 2 :(得分:0)

您查过这篇文章:Why max (max(a,b), c) is error?我认为这是一个相同的例子。显然,max的字符串版本会在内部进行解除。