К сожалению, я считаю, что стандарт не гарантирует, что std::map<DT, DT>
не будет создан. [temp.inst] / 1 указывает только, что
Если специализация шаблона класса не была явно создана или явно специализирована, специализация шаблона класса создается неявно, когда на специализацию ссылаются в контексте, который требует полностью определенного типа объекта или когда полнота типа класса влияет на семантику программы. [& Hellip;]
Обратите внимание, что это говорит нам только о том, что экземпляр шаблона гарантированно создан, но не дает никаких гарантий, что шаблон не будет создан, если такой экземпляр не требуется. [temp.inst] / 10 дает такую гарантию только на
[& hellip;] шаблон функции, шаблон переменной, шаблон члена, не виртуальная функция-член, класс члена, статический член данных шаблона класса или подстановка оператора constexpr if ([stmt .if]), если такой экземпляр не требуется. [& Hellip;]
Обратите внимание на отсутствие шаблонов классов в этом списке. Таким образом, я полагаю, что компилятору теоретически было бы разрешено создавать экземпляры std::map<DT, DT>
, даже если он думал, что в этом нет необходимости. Если создание экземпляра шаблона std::map
с DT
в качестве ключа и типа значения будет недопустимым, у вас возникнет проблема. Я не могу найти никаких гарантий относительно создания экземпляра std::map
с типом ключа, который не поддерживает оператор сравнения. Хотя я ожидал, что это будет работать в основном с любой реализацией, я думаю, что теоретически реализация будет иметь возможность, например, иметь static_assert
, который проверяет, соответствует ли тип ключа необходимым требованиям. [res.on.functions] / 1 , кажется, применимо (выделено мое):
В некоторых случаях (функции замены, функции-обработчики, операции над типами, используемыми для создания экземпляров стандартных шаблонных компонентов библиотеки) стандартная библиотека C ++ зависит от компонентов, предоставляемых программой C ++. Если эти компоненты не соответствуют их требованиям, Стандарт не устанавливает требований к реализации.
Таким образом, я думаю, что, строго говоря, стандарт не гарантирует, что использование std::map<DT, DT>
будет работать & hellip;
Если вы просто хотите использовать std::map<DT, DT>
в качестве типа тега для обозначения особого случая, я бы предложил просто не использовать std::map
, а что-то другое, например:
template <typename, typename>
struct default_config_tag;
, а затем default_config_tag<DT, DT>
или просто DT
в качестве вашего тега (не уверен, что аргумент должен быть экземпляром шаблона с двумя типами параметров) должно быть достаточно & hellip;