Извините за забавный заголовок.
До С++ 0x существуют ограничения в использовании функций-локальных структур ( "локальные типы" ) в качестве аргументов шаблона. Мой вопрос по существу, если подобные ограничения применяются к анонимным структурам. В частности, в контексте класса признаков:
template <typename T>
struct trait;
template <>
struct trait<int> {
typedef int type;
};
template <typename T>
struct trait<std::basic_string<T> > {
typedef struct {
T value;
} type;
};
trait<std::string>::type foo; // Is this valid?
template <typename T>
void f() { }
f<trait<std::string>::type> >(); // Is this?
template <typename T>
void g() { f<typename trait<T>::type>(); }
g<std::string>(); // And this?
Является ли это действительным и надежным? Он компилируется в последних версиях GCC и LLVM, но Im по-прежнему не уверен, является ли это строго обоснованным и понимается ли его VС++ и ICC.