Новое в C ++ 17: шаблоны шаблонов, которые соответствуют по умолчанию - PullRequest
0 голосов
/ 03 марта 2019

Стандарт C ++ 17 говорит, что это можно сделать:

template<class T, class U = T> class B { /* ... */ };
template<template<class> class P> class X { /* ... */ };

X<B> xb; // OK in C++17; ill formed in C++14

Стандарт C ++ 14 допускает ошибку в одном и том же коде.

Старый C ++ 14Правило имеет смысл для меня.Новое правило C ++ 17 этого не делает.Что изменилось?

Для справки приведенный выше пример кода появляется

  • в разделе.17.3.3 (3) стандарта C ++ 17 (черновик здесь ) и
  • в разд.14.3.3 (2 или 3) стандарта C ++ 14 (проект здесь ).

1 Ответ

0 голосов
/ 03 марта 2019

Для краткости пример кода опускает детали.Развернем пример:

template<class T, class U = T> class B { /* ... */ };
template<template<class> class P> class X {
    P<int, int> pii; // error: P has been declared to take only one argument
    P<int>      pi;  // OK
    P<char>     pc;  // OK
    /* ... */
};

X<B> xb; // OK in C++17; ill formed in C++14

Последняя строка разрешает P<int> как B<int>.Это правда, что последнее означает B<int, int>, но с учетом параметра по умолчанию, B<int> - это однозначный способ записать это.

В принципе, насколько я знаю, не было причины C++ 14 не мог этого понять, но цепочка рассуждений была слишком сложной для C ++ 14.Три года спустя C ++ 17 это понимает.

Кстати, компилятор Clang C ++ предлагает опцию -frelaxed-template-template-args для решения этой проблемы.Если вы используете шаблоны шаблонов в Clang, вы можете использовать эту опцию.(@ Rakete1111 признан тем, что привлек внимание к опции Clang.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...