Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++参考文献丢失_C++ - Fatal编程技术网

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); }