c-構造化されたバインディングの実装undergroundおよびstd :: tuple

タプル>、中括弧-INITリストから&LTのものを使用することができますように;それが打ち鳴らす中structured bindingsは、(私は(トランク282683)最近建て打ち鳴らすのバージョン4.0.0を使用)LT&からいくつかのものを使用して実装されていることを、本当ですinitializer_list&GTは;?

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 constおよびauto const&ありません。

ベストアンサー
はい、構造化バインディングはtuple_sizeとtuple_elementをカスタマイズポイントとして使用します。基本的なルールは、大体、

>最初に組み込み配列を処理します。
>次にtuple_size< T> :: value;を確認します。
>それが失敗した場合、クラスにすべてのパブリックデータメンバーがあるかどうかを確認します。

ステップ2が確実に機能するには、tuple_sizeがSFINAEに対応している必要がありますが、tuple_size< cv T>現在、SFINAEフレンドリーである必要はありません。したがって、the bug

転載記事の出典を記入してください: c-構造化されたバインディングの実装undergroundおよびstd :: tuple - コードログ