首页 >后端开发 >C++ >为什么在 `decltype` 中使用双括号会改变结果类型?

为什么在 `decltype` 中使用双括号会改变结果类型?

Patricia Arquette
Patricia Arquette原创
2024-10-31 11:15:29840浏览

Why Does Using Double Parentheses in `decltype` Change the Resulting Type?

decltype 中双括号的类型推导

在 C 中, decltype 关键字可用于确定表达式的类型。当与双括号一起使用时,它会表现出一种微妙的行为,可能会导致混乱。

问题:

考虑以下代码片段:

<code class="cpp">const int&&& foo();
int i;
struct A { double x; };
const A* a = new A();
decltype(foo()) x1 = i;     // type is const int&&&
decltype(i) x2;             // type is int
decltype(a->x) x3;          // type is double
decltype((a->x)) x4 = x3;   // type is const double&</code>

为什么第四行a->x加括号后结果类型会从double变成const double&?

答案:

解释在于使用 decltype 推导类型的规则。根据 C 语言标准:

  1. 如果 e 是不带括号的标识符或类成员访问,则 decltype(e) 返回 e 命名的实体的类型。
  2. 如果 e是一个左值,decltype(e) 返回 T&,其中 T 是 e 的类型。

在给定的示例中:

  • decltype(a->x)将 a->x 解释为类成员访问,产生 double 类型。
  • decltype((a->x)) 将 (a->x) 解释为左值,产生 a type of const double&.

因此,向 a->x 添加括号会将类型推导从访问的成员类型更改为对成员本身的引用。

以上是为什么在 `decltype` 中使用双括号会改变结果类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn