#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 😉