如何在不取消引用指针的情况下返回指针指针值?
How pointer pointee value returned without dereferencing pointer?
当我阅读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)
的例子中,类型T
是const 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
的字符串版本在内部进行了取消引用。
相关文章:
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 在这种情况下,当尝试从单独的类更新变量时,我是否需要使用指针?
- 我们可以在不使用head指针的情况下通过使用head的简单变量而不是head的指针来实现链表吗
- 在不工作的情况下为数组分配指针,但反过来也可以
- 对于多态类型T,如何在没有类型T实例的情况下获得指向T的虚拟表的指针
- 为什么不能指向指针,在没有强制转换的情况下访问结构成员?
- 有没有办法在没有reinterpret_cast的情况下保存多种类型的指针?
- (C++)如何在不导致 mem 泄漏的情况下将指针传递到分配了'new'的函数?
- C++:为什么可以在没有事先使用 new 的情况下在指向结构的指针上使用 delete?
- 在C++我可以在不在本地声明结构的情况下将结构作为指针传递吗?