cpu*_*uer 15 c++ pointers language-design reference
根据这个答案的评论,引用的引用主要是为了支持运算符重载,引用Bjarne Stroustrup:
引用的引用主要是为了支持运算符重载.C按值传递每个函数参数,并且按值传递对象的效率低或不合适,用户可以传递指针.在使用运算符重载的情况下,此策略不起作用.在这种情况下,符号方便是必不可少的,因此如果对象很大,则不能期望用户插入操作符的地址.
这意味着运算符重载无法使用指针.但它没有清楚地解释为什么运算符重载指针无法工作.为什么运算符重载不能用于指针?
IMO使用引用,指针也可以在其位置使用.
因为如果它被允许,那么它看起来不会很好,并且不会像参考那样直观.
假设它被允许,那么你会写:
struct A{};
A a, *pa, b;
a = pa ;//doesn't look good, also not intuitive. (not real C++)
Run Code Online (Sandbox Code Playgroud)
它看起来不太好,因为在左侧你是非指针,在右侧你是指针.看起来非常奇怪.此外,由于类型不匹配,因此它的确无关紧要.我的意思是,你要指向非指针的指针; 这样的任务应该做什么?将指针所指向的地址的内容复制到目标(非指针)并不是非常简单.
另一方面,作为参考允许(现实,而不是假设):
a = b; //looks good, intuitive, as now both side is same type
Run Code Online (Sandbox Code Playgroud)
通过引用,你们两方都是相同的类型,只有当它b被传递给operator=()作为参数时,才会通过引用传递(或者通过指针传递,因为引用是指针的语法糖),以避免不必要的复制,这反过来又不会牛逼影响性能,因为它会如果它传递 的价值.
值得注意的是,不仅b通过引用(或下面的指针)a传递,也通过指针传递给函数,因为我们知道在函数中,关键字this实际上是一个指针.
所以在C++中引入了引用,以使程序员看起来很好,直观,否则他们就是指针.实际上,大多数编译器在内部使用指针(指针机制)实现引用.
为什么它不适用于指针?因为它含糊不清.将
ostream* operator<<(ostream* s, const char* c);
Run Code Online (Sandbox Code Playgroud)
比赛
cout << 'a';
Run Code Online (Sandbox Code Playgroud)
要么
cout << "a";
Run Code Online (Sandbox Code Playgroud)
?
此外,您不能使用&临时的address-of().这应该怎么做:
complex<double> a, b, c;
cout << a + b * c;
Run Code Online (Sandbox Code Playgroud)
既然b * c是暂时的,总和也是.
?