为什么在类中定义没有定义默认构造函数的类类型变量通过编译了?

class T {
public:
    T(int i) :_i(i) {}
private:
    int _i;
};

class U {
private:
    T t;
};

如果定义了一个构造函数不是就会取消合成的默认构造函数吗?

可以定义不可以赋值是吧?刚才发现
const int ci;
int &ri;
也通过编译了。

语法这么规定的,因为t是成员变量

如果你写在函数里
main()
{
T t;
}
那就报错了。

通过编译是因为你既没有T类的对象也没有U类的对象
你在被调用到的函数里任意写上U u;或T t;
编译就过不去了

你那是声明一个对象,并没有为他分配内存

那是因为你到现在为止并没有生成类实例,并没有要调用默认构造函数,当你需要调用它的时候,编译器会自动为你调用