C++17 のクラステンプレートのテンプレート引数推論を使ってみて

C++17 では『クラステンプレートのテンプレート引数推論』という機能が新しく追加されました。
どういう機能かというと C++17 以前では以下のようなクラステンプレートを使用する場合はテンプレート引数を明示化する必要がありました。

template<typename T>
struct A{
    A(T t) : t{}
};

// テンプレート引数を渡して値を定義
auto a = A<int>{42};

しかし、C++17 ではこれを推論してくれるようになりました。

template<typename T>
struct A{
    A(T t) : t{}
};

// コンストラクタの引数から T 型を推論してくれる
auto a = A{42};

これによりクラステンプレートを生成する make_xxx みたいなヘルパ関数を大幅に削減する事が出来そうですね。
上記はコンストラクタから推論していますが、他にも『推定ガイド(deduction guide)』という構文を使用しても推論する事が出来ます。

[Clang 5.0(svn306440) では一部動作しなかった]

本題というか単に Clang 5.0(svn306440) だと動作しなかった、という話ですが。
Clang 5.0(svn306440) では次のようにクラステンプレートのインナークラスだとコンパイルエラーになりました。

template<typename F>
struct X{
    template<class T>
    struct A {
        A(T&& t) : value(t){}
        T value;
    };
};

// error: no viable constructor or deduction guide for deduction of template arguments of 'A'
auto a  = X<int>::A{42};

https://wandbox.org/permlink/ylwbjUX5xs6JFbfn

X がクラステンプレートでなかったり、GCC 8.0 では問題なかったので Clang のバグかなぁ…。

[参照]