Предположим, что у меня есть функция шаблона (например, foo
), который возвращает const
зависимый тип. Варианты для определения типа возвращаемого значения как const
это либо положить const слева от typename
ключевое слово:
template<typename T>
const typename T::bar
^^^^^
foo(T const& baz) {
...
}
или справа от зависимого типа:
template<typename T>
typename T::bar const
^^^^^
foo(T const& baz) {
...
}
Но что если я поставлю const
классификатор между typename
ключевое слово и зависимый тип?
template<typename T>
typename const T::bar
^^^^^
foo(T const& baz) {
...
}
Вышеуказанное, как и ожидалось, не компилируется для GCC и CLANG, но, к моему удивлению, VC ++ компилирует его нормально.
const
классификатор в таком контексте?Говорит ли стандарт C ++ о том, где уместно
место, чтобы положитьconst
классификатор в таком контексте?
Да. typename
появляется в имяТипа спецификатор, чья продукция
typename
вложенное имя спецификатор идентификатор
typename
вложенное имя спецификаторtemplate
выбирать простой шаблон-идентификатор
Другими словами, это должно сопровождаться непосредственно вложенное имя спецификатор. const
не допускается.
Других решений пока нет …