gpt4 book ai didi

c++ - 为什么 char[] 和 char* 作为 typedefs 不同,但有时......不是?

转载 作者:IT老高 更新时间:2023-10-28 21:42:09 25 4
gpt4 key购买 nike

在我关注 this question 时出现以下观察结果关于 char[]char* 的区别。

#include <iostream>

typedef char ar[];
typedef char* pr;
void f2(ar x, pr y)
{
std::cout << std::is_same<decltype(x), decltype(y)>::value << '\n';
std::cout << std::is_same<ar, pr>::value << '\n';
}

int main()
{
char data[] = "data";
char *ptr = data;
f2(data,ptr);
return 0;
}

输出(在 Apple LLVM 版本 4.2 (clang-425.0.28) 上)

1
0

为什么这些报告为不同的类型,而不是不同的 decltype()s ?我怀疑它们实际上是不同的 types 由于它们的 typedef 声明,但是为什么变量报告为 same 类型?

最佳答案

在 C++ 中,与在 C 中一样,声明为数组类型的参数调整(在编译时)为指针类型,特别是指向数组元素类型的指针。 p>

无论是直接指定数组类型还是通过 typedef 指定,都会发生这种情况(请记住,typedef 不会创建新类型,只是现有类型的别名)。

所以这个:

typedef char ar[];
typedef char* pr;
void f2(ar x, pr y)
{
// ...
}

真正的意思:

void f2(char* x, char* y)
{
// ...
}

C 和 C++ 共享的另一条规则是,数组类型的 表达式 在大多数但不是所有上下文中,隐式转换为指向数组对象的第一个元素。这意味着如果你定义一个数组对象:

char arr[10];

您可以使用该对象的名称作为函数的参数,该函数采用 char*参数(丢失边界信息)。

在 C 中,这种隐式转换不会发生的情况是:

  1. 当数组表达式是sizeof的操作数时(sizeof arr 产生数组的大小,而不是指针的大小);
  2. 当数组表达式是一元的操作数时& (&arr 是指向数组的指针,而不是指向指针的指针);和
  3. 当数组表达式是用于初始化数组类型对象的字符串文字时(char s[] = "hello";s 初始化为数组,而不是指针)。

这些情况(或 C++ 中出现的其他情况)都不会出现在您的程序中,因此您的调用:

f2(data,ptr);

传递两个 char* 类型的指针值至f2 .

内部 f2 ,参数对象xy都是 char* 类型, 所以 std::is_same<decltype(x), decltype(y)>::value是真的。

但是类型 arpr是不同的。 ar是不完整的数组类型char[] , 和 pr是指针类型char* .

这解释了您的程序的输出。奇怪的发生是因为参数 x ,您使用数组类型 ar 定义, 确实是 char* 类型,与 pr 的类型相同.

关于c++ - 为什么 char[] 和 char* 作为 typedefs 不同,但有时......不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18626126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com