尝试对对象使用C ++引用时遇到以下错误。在引用this question之后,我明白这是因为A()
返回临时变量,根据设计,它不允许被non-const reference
引用。但是,我仍然很好奇为什么C ++以这种方式设计。为什么A& ra2 = A();
无法作为A a1 = A(); A& ra1 = a1;
的简写?已知MSVC通过扩展来支持这种语法,但是其他实现中不包括该扩展。这种速记有特别的缺点吗?
class A {
public:
int a = 0;
};
int main()
{
A a1 = A();
A& ra1 = a1; //okay
A& ra2 = A(); //error: invalid initialization of non-const reference of type ‘A&’ from an rvalue of type ‘A’
return 0;
}
答案 0 :(得分:1)
在第
行A& ra2 = A();
=
运算符的右侧求值为临时对象。您只能使用const&
来引用临时对象。
该行
A& ra1 = a1; //okay
起作用,因为a1
不是临时对象,也不是const
对象。
答案 1 :(得分:0)
A& ra2 = A();
ra2
正在尝试引用临时变量。改变那个临时变量是没有任何意义的。所以,编译器禁止你做任何无意义的事情。
答案 2 :(得分:-2)
将引用视为具有编译时检查的花式指针,并且可能减少开销。
A& ra2 = A();
这说:
A
类型的临时对象。这是检查输入的地方。编译器意识到这没有意义,并告诉你。
你可能会对类似的语法感到困惑:
A my_a = A();
然而,这个例子截然不同。它说:
A
类型的临时对象。my_a
(调用my_a
的复制构造函数)