C++0x decltype и оператор разрешения области видимости

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

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

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

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

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

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

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


person user2023370    schedule 02.04.2011    source источник


Ответы (1)


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

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

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

person Johannes Schaub - litb    schedule 02.04.2011
comment
Visual Studio 2010 также страдает от этой проблемы. Хороший обходной путь. - person Timothy Shields; 15.05.2013