Доступ по типу в std::кортеж с дублированными типами должен привести к ошибке компиляции

#c #c 14 #std

Вопрос:

В соответствии со стандартом (или, по крайней мере, в соответствии с cppreference) кортеж std::get для std::должен:

5-8) Извлекает элемент кортежа t, типом которого является T. Не удается скомпилировать, если кортеж не содержит ровно один элемент этого типа.

Поэтому я интерпретирую это предложение так, что этот код не компилируется:

 std::tuple<int, int> my_record;
std::get<int>(my_record) = 10;
 

Потому что существуют два одинаковых типа, и я пытаюсь получить доступ к кортежу по типу. Однако и GCC, и Clang правильно компилируют этот код и производят эффект изменения первого элемента.

Почему? Я неправильно истолковываю предложение в ссылке? Является ли ссылка неправильной? Разве GCC и Clang не соблюдают стандарт?

Комментарии:

1. Не удается скомпилировать для меня godbolt.org/z/c15Ef3MP9 Интересно, что это меняется с версией компилятора. clang 11.0.1 и gcc 10.3 не удалось скомпилировать; более высокая версия скомпилирует его.

2. libstdc , похоже, действительно имеет ошибку, libc передает демонстрационную версию (ошибка в библиотеке, а не в компиляторе).

Ответ №1:

Похоже на ошибку GCC 11, подумайте о ее регистрации. Вот откровенная часть стандарта.

Вы видите это в Лязге, потому что на gcc.godbolt.org по умолчанию он использует стандартную библиотеку GCC. Если вы добавите -stdlib=libc для использования собственную стандартную библиотеку, она откажется ее компилировать.

Комментарии:

1. Ошибка подана: gcc.gnu.org/bugzilla/show_bug.cgi?id=101427 😉