Я очень хорошо знаю, почему нужно использовать typename
для зависимых типов, так как компилятор может не иметь возможности устранить неоднозначность между типом и объявлением переменной, когда он видит что-то вроде T::type
, см., Например, this answer для отличного объяснения. TL; DR: в выражении типа T::type * x;
компилятор не может «знать», является ли T::type
типом или, возможно, переменной, объявленной в определенной специализации для T
.Почему все еще необходимо устранить двунаправленный тип зависимого типа с именем типа в RHS использующего оператора?
Однако, в чем-то вроде
using type = T::type;
нет ничего неоднозначного. IMO, T::type
всегда следует анализировать как тип, так как он является частью RHS инструкции using
. Тем не менее, мы по-прежнему необходимо использовать typename
здесь (по крайней мере, в соответствии с НКУ и лязгом),
using type = typename T::type;
Live on Coliru, gcc Live on Coliru, clang
Visual C++ seems to accept the code без typename
, однако я не слишком много веры в компиляторе, который полностью соответствует стандарту (на самом деле он имеет множество нестандартных расширений, например, привязка значений r к неконстантным ссылкам).
Вопрос: Есть ли причина, по которой это не является исключением из правила typename
в C++ 11 и более поздних версиях?
Для downvoters: Я не задаю вопросы ради получения некоторых баллов. Если вы думаете, что вопрос - это дерьмо, или ответ тривиален, по крайней мере, дайте мне знать. Я очень хотел бы, чтобы современный C++ упрощался, и получение более чистого синтаксиса (imo) стоит. – vsoftco
Это один из случаев «никто никогда не предлагал». Я не могу думать о техническом аргументе против него. – Columbo
@Columbo Вот почему я задал вопрос, это комментарий к комментарию Брайана для [его ответа] (http: // stackoverflow.com/a/41841216/3093378) на [этот вопрос] (http://stackoverflow.com/q/41841195/3093378). – vsoftco