Проблема связана с конструкцией <unresolved-name>
в ABI. Зачем нам когда-либо хотеть использовать неразрешенное имя? Все дело в сопоставлении объявлений и перегрузках. С++ 14 §14.5.6.1/3 примечания,
Два разных шаблона функций могут иметь идентичные типы возвращаемых функций и списки параметров функций, даже если разрешение перегрузки не может их различить.
У вас может быть другая функция в другом файле,
template <typename T>
void baz(int quux) { std::abort(); }
Хотя эта сигнатура не может мирно сосуществовать в одном и том же файле — она не может быть названа из-за двусмысленности перегрузки — она может существовать в другом файле, поэтому ее необходимо изменить.
(Даже такой уровень сосуществования не гарантируется стандартом для всех шаблонов. Вопрос QOI заключается в том, что компилятор использует точную форму объявления шаблона функции для выполнения сопоставления объявлений, так что копирование и вставка объявления в определение будет иметь тенденцию чтобы обеспечить точное совпадение, а не неожиданный конфликт с другим шаблоном функции, который разрешается в ту же сигнатуру (см. §14.5.6.1/5-6).
Что касается дождя на параде default_order
, проблема заключается в том, что идентификаторы шаблонов неявно извлекают аргументы по умолчанию из шаблонов. Таким образом, пользователь может непреднамеренно иметь зависимое имя типа в подписи, просто упомянув std::set
.
person
Potatoswatter
schedule
20.10.2016