C++: указатели на члены объединения считаются отдельными?C++

Программы на C++. Форум разработчиков
Гость
C++: указатели на члены объединения считаются отдельными?

Сообщение Гость »

Этот игрушечный код:

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

union a {
int b;
int c;
};

template void b() {}
template void b< &a::b >()  {}
template void b< &a::c >()  {}
Прекрасно строится в clang и gcc, но в MSVC выдает:

ошибка C2766: явная специализация; 'void b
(void)' уже определен

Ссылка на компилятор-эксплорер: https://godbolt .org/z/TfoMjv8ch
Как видно в CE, в gcc/clang искажение имен специализаций кодирует имена членов объединения:

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

_Z1bIXadL_ZN1a1bEEEEvv
^
_Z1bIXadL_ZN1a1cEEEEvv
^
но в MSVC искажение кодирует только смещение члена внутри объединения (0), поэтому специализации считаются дублирующими:

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

??$b@$0A@@@YAXXZ
^
Это ошибка MSVC или неопределенное/неуказанное поведение? Есть какие-нибудь указания (хе-хе) на соответствующие стандартные положения?

Подробнее здесь: https://stackoverflow.com/questions/781 ... d-distinct

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