cpp中的引用绑定和类型转换之间的区别

问题描述

如果reference binding(初始化或作为函数参数传递)是implicit type conversion

如果不是,为什么要支持casting expression(static_cast,const_cast ...)以将non-reference entity强制转换为reference,所以我认为将所有内容统一是合理的。还有,如果引用是类型的一部分?

struct class A {};
int main() {
    int a = 1;
    static_cast<int &>(a);
    static_cast<int &&>(1);
    const_cast<A &&> (A()); // funny,const_cast<int &&> (1); doesn't work
    const_cast<int &>(a);
    const_cast<int && >(a);
    static_cast<int &&>(1);
}

解决方法

在设计C ++时,考虑到编码人员永远不会犯任何错误,因此,当人们将一个参数传递给函数或初始化变量时,编译器会尝试寻找一种可以使代码编译的转换。

这些转换也被视为参考绑定。在最佳情况下,引用直接绑定到初始化它的实体。在最坏的情况下,引用将绑定到临时实现的结果。我说最坏的情况是因为临时信息通常在完整表达的结尾处被销毁,这使它们成为悬挂参考的主要原因。

例如,在表达式static_cast <int &&>(1)中,将创建一个保留值1的临时目录,将引用绑定到该临时目录,销毁该临时目录,然后返回引用。那首歌疯了吗?

创建悬空引用的方法有很多类似的方法,几乎​​没有开发人员知道!例如:

vector <int> a {1,2,3,4};
auto && x = ++ a.begin();
auto cond = x != a.end();  //BOOOM

string f();

auto && s = f()+="10";
auto first_char = s[0]; //BOOOM

Demo on compiler explorer.

临时对象也可以实现,以绑定到隐式对象参数。在C ++中,可以通过应用严格的规则来避免此类错误:永远不要返回可能引用临时引用的引用。但是该规则实际上很难应用,甚至没有标准库或核心语言遵循:隐式声明的赋值运算符不具有ref限定。

老实说,我喜欢C ++,但我认为该语言绝对不安全,它是基于一种理想主义的编码概念而设计的,它激发了我的自我。因此,我认为C ++之所以如此成功,有两个原因:由于其与C的向后兼容性以及因为成功编写可按预期编译和运行的代码证明了编码人员的聪明程度!

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...