具有继承的嵌套类的名称查找

ltj*_*jax 9 c++ inheritance name-lookup

这保证是有效的:

struct A
{
  struct Gold {};
};

struct B : public A
{
  typedef Gold BaseGold;
  struct Gold {};
};

struct C : public B
{
  typedef Gold BaseGold;
  struct Gold {};
};

static_assert(is_same<B::BaseGold, A::Gold>::value, "Not the right treasure!");
static_assert(is_same<C::BaseGold, B::Gold>::value, "Not the right treasure!");
Run Code Online (Sandbox Code Playgroud)

它似乎适用于VS2010.显然它依赖于微妙的声明顺序/名称查找规则,所以我想知道标准在这个问题上说了什么......

APr*_*mer 8

未定义的行为.

3.3.7/1

以下规则描述了在类中声明的名称范围:

2)在S类中使用的名称N应在其上下文中引用相同的声明,并在完成的S范围内重新评估.违反此规则不需要诊断.