C++参考文献丢失
为什么要编译C++参考文献丢失,c++,C++,为什么要编译 struct A {}; struct B { B(A& _a) : a(_a) {} A &a; }; void f1(A&) {} void f2(const B &b) { f1(b.a); } int main() { A a; B b{a}; f2(b); return 0; } 在f2中b是常数,所以我的理解是b.a也应该是常数。但是它可以编译,并且编译器允许调用f1 替换“A&A
struct A {};
struct B {
B(A& _a) : a(_a) {}
A &a;
};
void f1(A&) {}
void f2(const B &b) { f1(b.a); }
int main() {
A a;
B b{a};
f2(b);
return 0;
}
在f2中b是常数,所以我的理解是b.a也应该是常数。但是它可以编译,并且编译器允许调用f1
替换“A&A;”在结构B中使用“A;”它不再有效了。
现在f1 b.a确实是常数:
invalid initialization of reference of type 'A&' from expression of type 'const A'
请帮我理解这个。。。谢谢。当一个对象是常量时,它不会导致引用成员也变成常量,因为引用对象不是对象本身的一部分。引用成员只是表示其他对象地址的一条信息。B对象本身是否是不可变的,不应该影响它是否可以改变它引用的对象
如果将B::a成员设为非引用,如a;,那么B对象本身实际上包含一个A对象,所以当前者是常量时,后者也是常量
在f2中b是常数,所以我的理解是b.a也应该是常数
是的。如果实例是const,那么它的成员也将是const。但看看成员的类型:
A & a;
这是对a的引用。使该常数产生对a的常数引用:
不是对常数a的引用。严格来说,没有常数引用。存在对常量对象的引用 在类B中,数据成员a被声明为对类型a的非常量对象的引用
A &a;
这个引用作为参数传递给一个函数,该函数接受对非常量对象的引用
void f1(A&) {}
void f2(const B &b) { f1(b.a); }
因此代码编译成功。错误:“const”限定符不能应用于“A&”谁这么说?在什么情况下?是的。不管怎么说,这更像是思想实验;
void f1(A&) {}
void f2(const B &b) { f1(b.a); }