Если шаблон класса использует лямбда-аргумент шаблона по умолчанию, каждое использование этого типа класса по умолчанию будет новым типом.
Код: Выделить всё
template
struct UniqueStruct {};
static_assert(!std::is_same_v);
Однако в одной единице перевода как производное, так и псевдоним класса сохраняет это производное/псевдоним к одному типу во всех современных компиляторах, которые я тестировал.
Код: Выделить всё
using UniqueAlias = UniqueStruct;
static_assert(std::is_same_v);
struct UniqueDerived : UniqueStruct {};
static_assert(std::is_same_v);
Будет ли такое поведение безопасно сохраняться во всех TU или существует вероятность того, что разные TU будут использовать разные лямбда-типы для UniqueAlias/UniqueDerived? Если да, то сделает ли это использование этих типов в нескольких TU небезопасным, оставив UniqueStruct единственным безопасным типом для использования в TU?
Подробнее здесь:
https://stackoverflow.com/questions/786 ... late-defau