当我阅读 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
}
答案 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
的字符串版本会在内部进行解除。