引用在c++中是独立的类型吗?如果不是,为什么要用这种类型来写

Are references separate types in C++? If not, why are they written in the type?

本文关键字:类型 为什么 种类 c++ 独立 引用 如果不      更新时间:2023-10-16

据我所述,引用可以在任何原始类型可以使用的地方使用(我是而不是暗示相反是正确的),唯一的区别是它们的突变语义(当变量用作左值时)。

难道它们不符合与原始类型相同的条件吗?如果是这样,为什么某些东西是引用,存储在它的类型中?

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

的例子:

void bar(int& a);
int x;
int& y = x;
bar(y) // matching type
bar(x) // what happened here? was x cast to a reference?

引用在形式上是类型;或者至少你可以在c++标准本身中读到"如果T是引用类型"之类的东西。

然而,你的问题是完全合理的,因为引用具有非常混乱的语义。它们不是完全的一级类型(例如,不能有引用到引用或指针到引用),在我看来,这是因为c++设法将两种不同类型的定义和使用引用的方式合并在一起。

引用真正做的是它为已经存在的对象(值)提供了一个替代名称。这是什么意思?这意味着它不"限定"本身的类型;它限定用于引用该值的名称("变量"、"存储")本身。

在c++中,类型和值的语义通常取决于存储对象/值的存储空间的附加属性。这并不总是明确的,这就是人们困惑的地方。

我认为,由于c++严重依赖于"存储"的概念(而不是将其隐藏为实现细节),因此确实应该有两个类型系统:一个用于纯本身,另一个用于存储,其中存储类型系统应该是值类型系统的超集。

另一个出现类似问题的例子是CV-qualification。不应该是constvolatile的对象/值本身。包含该值的存储可能是可变的,也可能不是可变的,并且可能需要也可能不需要对某些加载/存储优化进行保护。同样,如果能够在值和存储的情况下分别表示类型的这些属性,则可以更好地表达这一点。

据我所知,引用可以用在任何原始类型可以用的地方

那根本不是真的。

考虑:

void foo(int  x);
void bar(int& x);
foo(3);
bar(3); // whoops!

那这个呢:

struct T
{
   int& x;
};

对引用有不同的类型是没有意义的。这样,您就获得了函数重载的能力以及类型系统给您的所有其他好处。

否则你需要发明一些其他机制来表示一个事物是引用而不是非引用;类型系统肯定是表示这种情况的完美机制吗?

intint&是两种不同的类型。

据我所知,引用可以在原始类型可以使用的地方使用

。引用是指。你可以把它看作是一个伪装的指针。

在c++中引用是独立的类型吗?

是的。

如果不是,为什么要写成这种类型?

这只是指定引用类型的语法,使用&作为类型构建器符号。作为另一个例子,*是指针的类型构建器。除了类型推断的限制,我们现在可以用模板语法替换(1)不切实际的语法。


<一口> 1) C和c++的创建者都曾多次将原始的C声明语法描述为"失败的实验"。

与指针不同,引用不能被重新定位;它引用的地址不能更改。通过像指针一样,引用在避免复制语义时很有用,因此需要为已经存在的东西创建别名…也就是说,知道它是引用而不是对象意味着编译器知道在赋值或传递函数时不复制该对象。

EDIT:关于更新后的问题,"如果引用是不同的类型,为什么在很多情况下它们可以代替原始类型,而不需要显式强制转换?"是否存在隐含的类型转换?"…不是强制转换,它是一个引用,所以它只是通过"指向"原始对象而"解引用";把它想象成一个替代名或别名可能会有帮助。

相关文章: