Name-lookup of nested classes with inheritance
Is this guaranteed to work:
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 r开发者_开发知识库ight treasure!");
It seems to work on VS2010. Obviously it relies on subtle declaration order/name lookup rules, so I was wondering what the standard says on the matter...
Undefined behavior.
3.3.7/1
The following rules describe the scope of names declared in classes:
2) A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in the completed scope of S. No diagnostic is required for a violation of this rule.
Since there's been no quote yet, I've been playing around with your example:
Both gcc 4.5.1 and Clang 3.0 accept the code as can be seen below.
Now, we just need someone to dig out an authoritative answer. With Clang, gcc and VC++ agreeing though (not that frequent), it seems intended.
On ideone (4.5.1):
#include <utility>
struct A
{
struct Gold {};
};
struct B : public A
{
typedef Gold BaseGold;
struct Gold {};
};
struct C : public B
{
typedef Gold BaseGold;
struct Gold {};
};
static_assert(std::is_same<B::BaseGold, A::Gold>::value, "Not the right treasure!");
static_assert(std::is_same<C::BaseGold, B::Gold>::value, "Not the right treasure!");
On Clang:
#include <stdio.h>
template <typename T, typename U>
struct is_same { enum { value = false }; };
template <typename T>
struct is_same<T,T> { enum { value = true }; };
struct A
{
struct Gold {};
};
struct B : public A
{
typedef Gold BaseGold;
struct Gold {};
};
struct C : public B
{
typedef Gold BaseGold;
struct Gold {};
};
int main() {
if (!is_same<B::BaseGold, A::Gold>::value) {
printf("oups");
}
if (!is_same<C::BaseGold, B::Gold>::value) {
printf("oups");
}
}
Clang output (as expected):
define i32 @main() nounwind readnone {
entry:
ret i32 0
}
精彩评论