Рассмотрим следующий код:typename, члены типа и члены не-типа: это действительный код?
struct S {
struct type {};
type type;
};
int main() {
typename S::type t;
(void) t;
}
Помимо того факта, что далеко от того, чтобы быть хорошей идеей, я экспериментировал, прочитав другой вопрос здесь на SO.
я обнаружил, что фрагмент кода выше compiled with no errors by GCC и это rejected by clang 3.9 со следующей ошибкой:
error: typename specifier refers to non-type member 'type' in 'S'
Я подозреваю, что лязг является правильным в данном случае и GCC является неправильным (на самом деле, я открываю вопрос к последний).
Правильно ли это заключение или является допустимым использованием typename
?
Примечание: Я не спрашиваю, как его решить, я знаю, как это сделать. Я спрашиваю только, является ли этот код действительным или нет.
старше НКУ как 4.4.7 отклонит его тоже: http://melpon.org/wandbox/permlink/Oh2Rp4jWjGPIoIwv – marcinj
»не мог t найти что-нибудь в стандарте о законности этого. Тем не менее, 'typename' упоминается только в отношении шаблонов, так что, возможно, это нарушение по духу? Независимо от того, правильный и стандартный способ решения такой конкретной двусмысленности, похоже, является 'struct S :: type t;' – StoryTeller
@marcinj. Это похоже на то, что GCC 4.4.7 не реализует [CWG 382: Allow 'typename' outside шаблонов] (http://wg21.link/cwg382). – cpplearner