C ++ 0x decltype и оператор разрешения области видимости - PullRequest
14 голосов
/ 03 апреля 2011

С таким классом, как Foo:

struct Foo { static const int i = 9; };

Я обнаружил, что GCC 4.5 отклонит следующее

Foo f;
int x = decltype(f)::i;

Это будет работать, если я использую промежуточный typedef, такой как:

typedef decltype(f) ftype;
int x = ftype::i;

но я предпочитаю содержать пространство имен в чистоте.Я думал, что приоритет может быть проблемой, поэтому я также пробовал скобки, но не повезло.Это невозможно, как представлено, или есть синтаксис, который может мне помочь?

1 Ответ

13 голосов
/ 03 апреля 2011

Это действительно C ++ 0x, чтобы сказать decltype(f)::i.GCC просто пока не поддерживает это.Вы можете обойти его с помощью шаблона идентификации

template<typename T> struct identity { typedef T type; };
int x = identity<decltype(f)>::type::i;

identity является частью пространства имен boost::mpl.

...