结构化绑定实现在地下和std :: tuple

时间:2016-09-29 07:01:28

标签: c++ clang c++17 stdtuple structured-bindings

是真的,clang中的structured bindings(我使用最近构建的clang version 4.0.0 (trunk 282683))是使用来自<tuple>的一些东西来实现的,就像braces-init列表可能会使用东西一样来自<initializer_list>

我编写简单的代码只是为了与latest features implemented

中的一些一起玩
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>来使用结构化绑定吗?

其他:

autoauto &auto &&有效,但auto constauto const &无效。

1 个答案:

答案 0 :(得分:4)

是的,结构化绑定使用tuple_sizetuple_element作为自定义点。基本规则大致是

  1. 首先处理内置数组;
  2. 然后检查tuple_size<T>::value;
  3. 如果失败,则检查该类是否包含所有公共数据成员。
  4. 要使第2步可靠地工作,tuple_size需要SFINAE友好,但tuple_size<cv T>目前不需要SFINAE友好。因此the bug