【发布时间】:2018-01-26 07:24:24
【问题描述】:
为什么这段代码有效?我预计这会因为违反基本 C++ 规则之一而失败:
#include <iostream>
using namespace std;
struct A {
A() { cout << "ctor A" << endl; }
void doSth() { cout << "a doing sth" << endl; }
};
struct B {
B(A& a) : a(a) { cout << "ctor B" << endl; }
void doSth() { a.doSth(); }
A& a;
};
struct C {
C() : b(a) { cout << "ctor C" << endl; }
void doSth() { b.doSth(); }
B b;
A a;
};
int main()
{
C c;
c.doSth();
}
https://wandbox.org/permlink/aoJsYkbhDO6pNrg0
我预计这会失败,因为在 C 的构造函数中,当尚未创建此 A 对象时,B 会获得对 A 对象的引用。
我错过了什么吗?初始化顺序规则是否与字段顺序相同不适用于引用?
编辑: 更让我吃惊的是,我可以添加对“a.doSth();”的调用。在 B 构造函数中,这也将起作用。为什么?此时 A 对象不应该存在!
【问题讨论】:
-
@JonathanPotter 引用不是指针。也许它被实现为指针,但即使总是这样,引用仍然不是指针
-
@VTT 没有理由这样做。
-
@VTT 对不起,我的意思是说没有有效理由这样做。还有have a read
-
@UKMonkey
a(a)是惯用的 C++。它可能在某些时候会引起某些人的困惑,但a(a_)确实现在为每个人添加了混乱。 -
@VTT 这里没有冲突。
标签: c++