当我阅读C++模板时--完整的指南(大卫·范奉献德,尼科莱·M·乔苏蒂斯)--我对下面的例子感到困惑
此示例是从标题重载函数模板中复制的,但我的问题与重载或模板无关。
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
}发布于 2014-03-07 19:34:34
代码是比较指针指向的地址,而不是指针指向的对象的值。
在::max(s1, s2, s3)的例子中,T类型是const char*,这意味着整个类型是const char* const&,使用<和>之类的比较运算符( max在幕后使用)比较哪个指针“指向更大的地址”。
发布于 2014-03-07 18:03:17
但是这些地址是如何在不取消引用指针的情况下转换为值的。
如果我明白你所说的“转换为价值”是什么意思。函数只是比较指针的值,即它们存储的地址,这与这些地址的字符串的实际内容完全无关。假设这里的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,那么这个注释就没有意义了。
发布于 2014-03-07 18:09:09
你查过这个帖子了吗:Why max (max(a,b), c) is error?我想大概是同一个例子。显然,max的字符串版本在内部执行解除引用。
https://stackoverflow.com/questions/22257218
复制相似问题