Как ODR взаимодействует с «уникальными» типами, которые используют шаблон, не являющийся типом, по умолчанию использующиC++

Программы на C++. Форум разработчиков
Anonymous
Как ODR взаимодействует с «уникальными» типами, которые используют шаблон, не являющийся типом, по умолчанию использующи

Сообщение Anonymous »

Если шаблон класса использует лямбда-аргумент шаблона по умолчанию, каждое использование этого типа класса по умолчанию будет новым типом.

Код: Выделить всё

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

Вернуться в «C++»