【发布时间】:2013-09-05 00:55:28
【问题描述】:
当我关注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 类型?
【问题讨论】:
-
腐烂? (作为函数参数)
-
(详细说明我的评论:)函数的参数类型按照 [dcl.fct]/5 进行“衰减”:“确定每个参数的类型后,任何类型为“数组”的参数
T”或“函数返回T”分别调整为“指向T”或“指向返回T的函数的指针”。因此decltype(x)是指向char的指针,而不是char的未知边界数组(与ar不同)。 -
@DyP 谢谢你的标准参考,先生。
-
@WhozCraig 你可能想检查 std::decay (en.cppreference.com/w/cpp/types/decay)。
-
愿你问过的唯一问题能带你进入神奇的 20k !我可以第一个祝贺你吗...