const зависимые имена, возвращаемые из шаблонных функций, куда идет const?

Предположим, что у меня есть функция шаблона (например, 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 ++ компилирует его нормально.

Q:

  • Это расширение VC ++?
  • Говорит ли стандарт C ++ о том, где подходящее место для размещения? const классификатор в таком контексте?

7

Решение

Говорит ли стандарт C ++ о том, где уместно
место, чтобы положить const классификатор в таком контексте?

Да. typename появляется в имяТипа спецификатор, чья продукция

typename вложенное имя спецификатор идентификатор
typename вложенное имя спецификатор templateвыбирать простой шаблон-идентификатор

Другими словами, это должно сопровождаться непосредственно вложенное имя спецификатор. const не допускается.

11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]