use*_*570 7 c++ reference language-lawyer c++11 c++14
您好,我正在阅读有关 C++ 中的表达式和整个语句的内容
声明0.0
每个表达式都有一些非引用类型
引用的语句来自 en.cppreference.com/w/cpp/language/value_category。检查页面顶部的第 2 行。
现在我举了一些例子来理解这意味着什么。例如:
int i = 100; // this expression has type int
int &j = i; // this expression has type int or int&?
Run Code Online (Sandbox Code Playgroud)
我的困惑是,我知道 j 是对 int 的引用,即 j 是 int& 但根据引用的语句,每个表达式具有非引用类型将意味着具有int &j = i;
int 类型。它是否正确?我感到困惑的其他例子:
int a[4] = {2,4,4,9};
a[3]; // will this expression be int& type or int type?
Run Code Online (Sandbox Code Playgroud)
现在在语句中a[3];
我知道 a 是一个数组左值,因此 a[3] 返回对最后一个元素的左值引用。但是,令人困惑的是引用的语句 0.0 是否意味着整个表达式a[3];
是 int 或 int& 类型?
这是另一个例子:
b[4]; // Here assume that b is an array rvalue. So will this expression has type int&& or int?
Run Code Online (Sandbox Code Playgroud)
所以我的问题是指针也会发生类似的情况吗?这意味着我们对于指针也有类似的声明(0.0)吗?
int x = 34;
int *l = &x; // will this expression have type int* or int?
Run Code Online (Sandbox Code Playgroud)
我现在这里 l 是一个指向 int(复合类型)的指针。如果对于指针没有类似的声明,那么对于引用还需要这个声明吗?这就是为什么我们只去掉参考部分?
\n\nRun Code Online (Sandbox Code Playgroud)\nint i = 100; // this expression has type int\nint &j = i; // this expression has type int or int&?\n
这些陈述根本不是表达。这些是声明。它们确实包含子表达式 100 和i
,两者的类型均为int
。如果j
在此声明后使用 id 表达式,则该表达式的类型将为int
。
\n\n所以我的问题是指针也会发生类似的情况吗?
\n
不会。指针是非引用类型,类似的情况不会发生在具有指针类型的表达式上。
\n\n\n为什么我们只去掉参考部分?
\n
这就是语言的工作原理。它允许我们以相同的方式对待对象和对象的引用。
\n这就是为什么您不需要(也不能)显式使用间接运算符来访问引用的对象,这与需要使用间接运算符来访问指向的对象不同。
\n这是实际的语言规则(来自最新的标准草案):
\n\n\n[表达式类型]
\n如果表达式最初的类型为 \xe2\x80\x9c 对 T\xe2\x80\x9d ([dcl.ref], [dcl.init.ref]) 的引用,则在进行任何进一步分析之前,该类型将调整为 T。\ n表达式指定引用所表示的对象或函数,并且表达式是左值或x值,具体取决于表达式。
\n