如何解决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
临时对象也可以实现,以绑定到隐式对象参数。在C ++中,可以通过应用严格的规则来避免此类错误:永远不要返回可能引用临时引用的引用。但是该规则实际上很难应用,甚至没有标准库或核心语言遵循:隐式声明的赋值运算符不具有ref限定。
老实说,我喜欢C ++,但我认为该语言绝对不安全,它是基于一种理想主义的编码概念而设计的,它激发了我的自我。因此,我认为C ++之所以如此成功,有两个原因:由于其与C的向后兼容性以及因为成功编写可按预期编译和运行的代码证明了编码人员的聪明程度!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。