Предположим, что у нас есть следующий код:
template<typename T>
class C
{};
template <typename T, template <typename> class Container>
void dummyMe(Container<T>&&)
{};
int main(int argc, char* argv[])
{
C<int> c;
dummyMe(c);
return 0;
}
Что не скомпилируется из-за первого аргумента dummyMe
, являющегося ссылкой rvalue. Может ли кто-нибудь объяснить мне в Standardese, почему параметры шаблона шаблона не совпадают с ссылками на пересылку и почему это так на простом английском языке.
P.S. Я наткнулся на этот и что, но я не вижу реальных доказательств в ответах.
Ответ по приведенной выше ссылке и ответ на этот вопрос утверждают, что Container<T>
нельзя считать параметром шаблона. И я не вижу причин, почему это так. Пусть сделать пример еще проще:
template <template <typename=int> class Container>
void dummyMe(Container<>&&)
{};
Теперь у нас есть пример, почти идентичный следующему:
template <typename Container>
void dummyMe(Container&&)
{};
Но это трактуется совершенно по-другому. Зачем? Почему Container<>&&
нельзя считать одним и тем же с template <typename=int> class Container
как Container&&
до typename Container
?