在C++中引用是否是单独的类型?如果没有,为什么他们写的类型?

cor*_*zza -1 c++ types reference language-lawyer

据我所知,可以在原始类型可以使用的地方使用引用(我并不暗示反向是真的),唯一的区别是它们的变异语义(当变量用作左值时).

那么他们不会像原版那样符合资格吗?如果是这样,为什么某些东西是一个参考,存储在它的类型中?

编辑:如果引用是不同的类型,为什么它们可以在很多情况下替换原始类型,而无需显式转换?是否涉及隐式演员?

例:

void bar(int& a);

int x;
int& y = x;

bar(y) // matching type
bar(x) // what happened here? was x cast to a reference?
Run Code Online (Sandbox Code Playgroud)

The*_*ant 5

参考一个正式的类型; 或者至少你可以阅读C++标准本身中的"如果T是引用类型".

但是,您的问题完全合法,因为引用具有非常混乱的语义.他们不是一流的类型(例如,你不能有一个引用到引用或指针到基准),在我看来这是因为C++管理混为一谈两种不同的类型与它如何定义和使用引用.

引用的真正含义是它为已存在的对象(值)提供了一个替代名称.这是什么意思?这意味着它不会"限定" 它所指的价值类型; 它更确定了用于引用该值的名称("变量","存储")本身.

在C++中,类型和值的语义通常取决于存储对象/值的存储的其他属性.这并不总是明确的,这就是让人困惑的东西.

我认为,因为C++在很大程度上依赖于暴露"存储"的概念(而不是将其隐藏为实现细节),所以应该有两种类型的系统:一种用于纯本身,另一种用于存储,其中存储类型系统应该是值类型系统的超集.

出现非常类似问题的另一个例子是CV资格.这不是一个对象/值本身应该是constvolatile.它是包含该值的存储,可能是也可能不是可变的,并且可能需要或可能不需要保护其免受某些加载/存储优化的影响.同样,如果有一种方法可以在值和存储的情况下分别表达类型的这些属性,则可以更好地表达.

  • __那是因为C++设法将两种不同类型的东西混为一起_这是一个非常好的观察.C++中的类型系统不仅用于描述值,还用于描述它们的访问方式. (2认同)