C++11 为什么'decltype(x)'和'decltype((x))'的类型不同?

2023-11-25

我发现它们是不同的,并且语言标准规定了每个语句应该检索什么样的类型(变量和表达式之间的差异)。但我真的很想知道为什么这两种类型应该不同?

#include<stdio.h>
int x=0;
decltype((x)) y=x;
int main()
{
    y=2;
    printf("%d,",x);
    decltype((1+2))&z=x;//OK (1+2) is an express, but why decltype should differ?
    z=3;
    printf("%d\n",x);
    return 0;
}

运行结果为‘2,3’

So why decltype((int)) is int&by design,这里C++语言设计的考虑是什么?任何语法一致性都需要这样的设计吗? (我不希望得到“这是设计使然”)

感谢您的解释。


如果你读过例如this decltype参考你会看见

2) 如果参数是不带括号的id-表达式或不带括号的类成员访问表达式,...

3)如果参数是任何其他表达...

... b) 如果值类别表达是左值,那么decltype yields T&;

[Emphasis mine]

然后再往下一点注释

请注意,如果对象的名称带有括号,则它将被视为普通的左值表达式,因此decltype(x) and decltype((x))通常是不同的类型。

因为您使用带括号的表达式,所以它被视为左值,这意味着上面的 3.b 处于活动状态并且decltype((x))给你int& if x is int.

应该注意的是,虽然该参考文献不具有权威性,但它源自规范,并且通常是可靠且正确的。


来自 C++11 规范 ISO/IEC 14882:2011,第 7.1.6.2 节 [dcl.type.simple],第 4 小节:

表示的类型decltype(e)定义如下:

— if e是不带括号的 id 表达式或不带括号的类成员访问 (5.2.5),decltype(e)是命名实体的类型e。如果不存在这样的实体,或者如果e命名了一组重载函数,该程序是格式错误的;

——否则,如果e是 x 值,decltype(e) is T&&, where T是类型e;

——否则,如果e是一个左值,decltype(e) is T&, where T是类型e;

- 否则,decltype(e)是类型e

并举一个例子:

struct A { double x; };
const A* a = new A();
...
decltype((a->x)) x4 = x3; // type is const double&

基本上与之前链接的参考文献所说的完全一样。

以你的例子来说,e规范中是(x)(因为你有declspec((x)))。现在第一种情况不适合,因为(x)不是不带括号的表达式。第二种情况不适合,因为(x)不是一个xvalue。第三种情况虽然匹配,(x)是类型的左值int, 领导decltype((x)) to be int&.

所以你的问题的答案很简单:因为规范是这么说的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11 为什么'decltype(x)'和'decltype((x))'的类型不同? 的相关文章

随机推荐