Я читал чужой код, когда наткнулся на этот фрагмент (урезанный до MWE):
template<typename R> class Test {
public:
typedef R R;
};
Здесь есть typedef
параметра шаблона самому себе, и это заставило GCC и clang (с -std=c++2a
или без него) жаловаться:
test.cc:3:19: ошибка: объявление параметра шаблона тени 'typedef R Test::R'
Однако ICC и MSVC в Compiler Explorer принимают эту часть.
Я прочитал этот вопрос, и предполагается, что typedef
себе обычно не подходит. Однако здесь, похоже, это не так. Я также обнаружил, что этот вопрос связан но я думаю, что они должны быть разными, так как здесь мы используем typedef
.
Итак, вот вопрос:
Разрешено ли такое переопределение стандартом? Есть ли побочные эффекты этого утверждения? Почему можно так написать?
R
чему-то еще, кто знает, что ему передается экземплярTest
, но не обязательно знает, что такоеR
. Это похоже на то, какstd::vector<T>
имеетstd::vector<T>::value_type
. - person Nathan Pierson   schedule 13.07.2021