Это известная ошибка.См. https://bugs.llvm.org/show_bug.cgi?id=33236.
По сути, проблема в том, что стандарт C ++ 17 определяет, что объявление структурированной привязки обрабатывает T
как тип, подобный кортежу, и использует std::tuple_size<T>::value
всякий раз, когда определено std::tuple_size<T>
;но он также указывает, что стандартная библиотека определяет std::tuple_size<T>
для всех константных типов T
.
Это означает, что при компиляции const auto&[r3, r4] = x;
Clang ищет std::tuple_size<const X>
и находит определение в стандартной библиотеке(который предоставлен MSVC).Поскольку определение std::tuple_size<const X>
успешно найдено, Clang пытается использовать протокол связывания типа «кортеж», и он, безусловно, терпит неудачу: const X
совсем не похоже на кортеж!
Предложение от сопровождающего STL MSVC( source ):
Обходной путь: не используйте const в структуре.