Почему структурированное связывание не работает должным образом на struct? - PullRequest
0 голосов
/ 11 декабря 2018
struct X { int a, b; };

int main()
{
    auto p = std::pair{ 1, 2 };
    const auto&[r1, r2] = p; // ok

    X x{ 1, 2 };
    const auto&[r3, r4] = x; // error
}

clang 7.0 (в Windows) сообщение об ошибке:

error : cannot decompose this type; 'std::tuple_size<const X>::value' is not a valid 
           integral constant expression

Почему структурированное связывание не работает должным образом в struct?

1 Ответ

0 голосов
/ 11 декабря 2018

Это известная ошибка.См. 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 в структуре.

...