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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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