地下结构化绑定实施和 std::tuple
Structured bindings implementation underground and std::tuple
clang
中的 structured bindings(我使用最近构建的 clang version 4.0.0 (trunk 282683)
)是使用 <tuple>
中的一些东西实现的吗,比如大括号初始化列表可能使用来自 <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;
到目前为止一切顺利,但是当我在 auto
之前添加 const
限定符时:
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 &
无效。
是的,结构化绑定使用 tuple_size
和 tuple_element
作为自定义点。基本规则大致是
- 首先处理内置数组;
- 然后检查
tuple_size<T>::value
;
- 如果失败,则检查 class 是否具有所有 public 数据成员。
要使步骤 #2 可靠地工作,tuple_size
需要对 SFINAE 友好,但 tuple_size<cv T>
目前不需要对 SFINAE 友好。因此 the bug.
clang
中的 structured bindings(我使用最近构建的 clang version 4.0.0 (trunk 282683)
)是使用 <tuple>
中的一些东西实现的吗,比如大括号初始化列表可能使用来自 <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;
到目前为止一切顺利,但是当我在 auto
之前添加 const
限定符时:
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 &
无效。
是的,结构化绑定使用 tuple_size
和 tuple_element
作为自定义点。基本规则大致是
- 首先处理内置数组;
- 然后检查
tuple_size<T>::value
; - 如果失败,则检查 class 是否具有所有 public 数据成员。
要使步骤 #2 可靠地工作,tuple_size
需要对 SFINAE 友好,但 tuple_size<cv T>
目前不需要对 SFINAE 友好。因此 the bug.