这个问题是由于杀死了我的回答而引起的
问题 :
阅读 C++ 中的引用和指针 引用、指针引用是什么样的,它们在 C 中是如何使用的?
回答 :
// обычная переменная int i = 1 ; // указатель int * const p = & i ; // ссылка * p ; // по ссылке присвоить значение * p = 2 ;
我们用 来检查变量的类型,并用 来typeid
创建相同类型的新变量decltype
。
# include <utility>
# include <iostream>
# include <typeinfo>
int main ( ) {
int i = 0 ;
int * p = & i ;
int & s = i ;
std::cout<<"typeid(i).name()=="<<typeid(i).name()<<std::endl;
std::cout<<"typeid(p).name()=="<<typeid(p).name()<<std::endl;
std::cout<<"typeid(s).name()=="<<typeid(s).name()<<std::endl;
std::cout<<"typeid(*p).name()=="<<typeid(*p).name()<<std::endl;
// decltype(s) s2 ; // error: 's2' declared as reference but not initialized
// decltype(*p) pp2 ; // error: 'pp2' declared as reference but not initialized
}
印刷 :
typeid(i).name()==i
typeid(p).name()==Pi
typeid(s).name()==i
typeid(*p).name()==i
为什么编译器说*p
这是一个链接,但是这个网站的所有大师都说不是。
我读了英文问题:https ://stackoverflow.com/questions/48388510/generally-is-dereference-pointer-expression-results-a-reference-type/48388647#48388647 ,什么都不懂(后来出现了)。
取消引用指针会产生一个指向类型的左值表达式,该类型指定指向的对象或函数。它不产生参考。
*pi
是类型的左值int
。
因为有两个“正交”的概念系统:
value_category
:https ://en.cppreference.com/w/cpp/language/value_category这个
lvalue
等等rvalue
_和类型:这是
reference
,value
,pointer
这两个系统通过一个列表相互连接(列表在文章中,我会摘录):
左边是三种不同的类型,右边是相同的
value_category
在您的推理中,您将
value_category
“左值”标识为 creference
(第 2 行),这是一个错误。一组类似的三段论:
X吃草,X是谁?你自信地说“兔子!”,虽然正确的答案是“我不知道,这三个中的一个 - 它可能是一头牛、一只兔子或一只山羊。”
表达式永远没有引用类型。只有变量才能拥有它们。
同样重要的是要记住它
typeid
忽略了引用性和 cv 限定符(即 const、volatile)。此外,
decltype
还内置了对变量的特殊处理。虽然变量名也是一个表达式,但是如果给定decltype
一个变量,它会准确返回变量的类型,而不是表达式的类型。此外,当应用于表达式时,根据表达式的类别(分别为左值、xvalue、prvalue),为其类型添加或不添加
decltype
任何内容。由于表达式本身不能有引用类型,所以没有冲突。&
&&
要强制
decltype
将变量名称完全视为表达式,必须将其放在第二对括号中。考虑例子。让我们有:
x
int
int
, 左值y
int &
int
, 左值*p
int
, 左值42
int
, 价值那么,分别:
decltype(x)
=int
(变量类型)decltype((x))
=int &
(表达式类型int
,加上&
表示左值类别)decltype(y)
=int &
(变量类型)decltype((y))
=int &
(表达式类型int
,加上&
表示左值类别)decltype(*p)
=int &
(表达式类型int
,加上&
表示左值类别)decltype(42)
=int
(表达式类型int
, 类别纯右值匹配没有 & 符号)