In C++ le cose cambiano con l'overload degli operatori. Anche se questo compila dio sa cosa fa.
struct _b
{
	_b operator +(const _b & rhs) const
	{
		_b b_ = rhs;
		return b_;
	}
};
struct _x
{
	_b operator [](const _b & rhs)
	{
		return rhs;
	}
	_x operator =(const _b & rhs)
	{
		return *this;
	}
};
struct _y
{
	_x x;
	
	_x operator [](const _x & rhs)
	{
		return rhs;
	}
};
int main()
{
	struct _y y;
	struct _x x;
	struct _b b;
	y[y.x] = b + x[b];
	return 0;
}
Questo per quanto riguarda la prima. La seconda lo fai te.