4

これは clang の問題のように見えます (私は既にclang にバグをオープンしました) が、間違いを犯していないことを確認したいと思います。

次のコードを検討してください。

struct B { };

template<typename...>
struct D;

template<typename T, typename U, typename... A>
struct D<T, U, A...>: D<U, A...> {
    using C = D<U, A...>; // (1)
    // using D<U, A...>::D; // (2)
    // using C::C; // (3)
    using C::D; // (4)
};

template<typename T>
struct D<T>: T { using T::T; };

int main() {
    D<int, double, B> d{};
}

行 (2) ((1) と (4) がコメント化されている場合) および (3) ((4) がコメント化されている場合) は期待どおりに動作しますが、(1) (上記の例をそのまま) を実行すると、次のエラーが発生します。

11 : エラー:
C::D を使用して 'typename' のない型に解決された依存型 using 宣言。

[...]

11 : エラー: using 宣言が 'C::' を参照していますが、これは
C::D を使用する 'D' の基本クラスではありません。

とにかく、Cは のエイリアスでありD<U, A...>、 の基底クラスですD<T, U, A...>
私の知る限り、そのスニペットはコンパイルされるはずです。私が間違っている?

GCC は、少なくともv4.8.1からv6.1までコンパイルすることに注意してください。

4

1 に答える 1

0

clang のチケットに記載されているように、これはバグとは見なされません (おそらく):

Clang は、コア イシュー 2070 ( http://wg21.link/cwg2070 ) の指示に従います。これは、元の提案の意図と一致します (http://wg21.link/n2540 の「ソリューションの概要」の最後を参照してください)。 )。そのため、これは意図したとおりに機能しています。コンストラクターを継承するには、:: の前後で同じ識別子を使用する必要があります。

于 2016-06-05T18:48:06.043 に答える