Реализация структурированных привязок в андеграунде и std :: tuple

Это правда, что структурированные привязки в clang (Я использую недавно построенный clang version 4.0.0 (trunk 282683)) реализованы с использованием некоторых вещей из <tuple>Например, в списках фигурных скобок могут использоваться <initializer_list>?

Я написал простой код, чтобы поиграть с некоторыми из последние функции реализованы:

struct S { int a; char b; double c; };
auto [a, b, c] = S{1, '2', 3.0};
using A = decltype(a);
using A = int;
using B = decltype(b);
using B = char;
using C = decltype(c);
using C = double;

Пока все хорошо, но когда я добавляю const классификатор до auto:

struct S { int a; char b; double c; };
const auto [a, b, c] = S{1, '2', 3.0};
using A = decltype(a);
using A = int const;
using B = decltype(b);
using B = char const;
using C = decltype(c);
using C = double const;

Я получаю странное описание ошибки:

In file included from /home/user/test/main.cpp:1:
In file included from /home/user/test/./test.hpp:4:
In file included from /usr/local/bin/../include/c++/v1/utility:193:
/usr/local/bin/../include/c++/v1/__tuple:29:14: fatal error: implicit instantiation of undefined template 'std::__1::tuple_size<S>'
: public tuple_size<_Tp> {};
^
/home/user/test/main.cpp:110:16: note: in instantiation of template class 'std::__1::tuple_size<const S>' requested here
const auto [a, b, c] = S{1, '2', 3.0};
^
/usr/local/bin/../include/c++/v1/__tuple:25:50: note: template is declared here
template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_size;
^

То есть есть взаимодействие с случайно включенным <tuple>,

Я знаю, что структурированные привязки частично реализованы в clangно в любом случае интересно как <tuple> может быть связано с ними?

Должен ли я включить <tuple> использовать структурированные привязки?

Дополнительно:

auto, auto & а также auto && работает, но auto const а также auto const & не.

3

Решение

Да, структурированное связывание использует tuple_size а также tuple_element в качестве точек настройки. Основное правило, примерно,

  1. встроенные массивы первой ручки;
  2. затем проверьте tuple_size<T>::value;
  3. если это не удается, тогда проверьте, есть ли в классе все открытые члены данных.

Чтобы шаг № 2 работал надежно, tuple_size должен быть SFINAE-дружественным, но tuple_size<cv T> в настоящее время не обязательно быть SFINAE-friendly. следовательно баг.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]