引用在c++中是独立的类型吗?如果不是,为什么要用这种类型来写
Are references separate types in C++? If not, why are they written in the type?
据我所述,引用可以在任何原始类型可以使用的地方使用(我是而不是暗示相反是正确的),唯一的区别是它们的突变语义(当变量用作左值时)。
难道它们不符合与原始类型相同的条件吗?如果是这样,为什么某些东西是引用,存储在它的类型中?
编辑:如果引用是不同的类型,为什么在很多情况下它们可以代替原始类型,而不需要显式强制转换?是否涉及到隐式强制转换?
的例子:
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。不应该是const
或volatile
的对象/值本身。包含该值的存储可能是可变的,也可能不是可变的,并且可能需要也可能不需要对某些加载/存储优化进行保护。同样,如果能够在值和存储的情况下分别表示类型的这些属性,则可以更好地表达这一点。
据我所知,引用可以用在任何原始类型可以用的地方
那根本不是真的。
考虑:
void foo(int x);
void bar(int& x);
foo(3);
bar(3); // whoops!
那这个呢:
struct T
{
int& x;
};
不对引用有不同的类型是没有意义的。这样,您就获得了函数重载的能力以及类型系统给您的所有其他好处。
否则你需要发明一些其他机制来表示一个事物是引用而不是非引用;类型系统肯定是表示这种情况的完美机制吗?
int
和int&
是两种不同的类型。
”据我所知,引用可以在原始类型可以使用的地方使用
。引用是指。你可以把它看作是一个伪装的指针。
”在c++中引用是独立的类型吗?
是的。
”如果不是,为什么要写成这种类型?
这只是指定引用类型的语法,使用&
作为类型构建器符号。作为另一个例子,*
是指针的类型构建器。除了类型推断的限制,我们现在可以用模板语法替换(1)不切实际的语法。
<一口> 1) C和c++的创建者都曾多次将原始的C声明语法描述为"失败的实验"。一口>
与指针不同,引用不能被重新定位;它引用的地址不能更改。通过像指针一样,引用在避免复制语义时很有用,因此需要为已经存在的东西创建别名…也就是说,知道它是引用而不是对象意味着编译器知道在赋值或传递函数时不复制该对象。
EDIT:关于更新后的问题,"如果引用是不同的类型,为什么在很多情况下它们可以代替原始类型,而不需要显式强制转换?"是否存在隐含的类型转换?"…不是强制转换,它是一个引用,所以它只是通过"指向"原始对象而"解引用";把它想象成一个替代名或别名可能会有帮助。
- 使用简单类型列表实现的指数编译时间.为什么
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 包含的类类型显然没有声明,为什么?
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- NTTP 的结构类型:为什么所有成员都必须是公共的?
- 为什么 std::bitset 只支持整型数据类型?为什么不支持浮点数?
- C++异常返回类型为什么字符*
- 线程之间的Qt连接类型:为什么这样做
- 无效使用不完整的类型-为什么在这种情况下没有错误