クラスが独自のプライベート静的constexprメソッドにアクセスできない-Clangバグ?


28

このコードはClang(6、7、8、9、trunk)ではコンパイルされませんが、GCC(7.1、8.1、9.1)では問題なくコンパイルされます。

template<class T> struct TypeHolder { using type = T; };

template<int i>
class Outer {
private:
    template<class T> 
    static constexpr auto compute_type() {
        if constexpr (i == 42) {
            return TypeHolder<bool>{};
        } else {
            return TypeHolder<T>{};
        }
    }

public:
    template<class T>
    using TheType = typename decltype(Outer<i>::compute_type<T>())::type;
};

int main() {
    Outer<42>::TheType<int> i;
}

Clangは私に言っています:

<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'

…もちろんそうですが、同じクラスからそのメンバーにアクセスしようとしています。そこにアクセスできない理由はわかりません。Clangのバグを見つけましたか(また、報告する必要がありますか)?

Godboltのコンパイラーエクスプローラーでコードをいじることができます。


3
どうやら追加friend int main();はClangが文句を言うのを止めます。
HolyBlackCat

2
おかしい!しかし、アクセスチェックは間違いなくの「許可」で行われるべきです-そうでOuter<42>はありませんmainか?私にとっては、さらにバグのように見えます。
Lukas Barth

使用しないstd::result_of代わりに仕事を?
ブランドン

FWIW、ICCおよびMSVCでも動作します。
ChrisMM

回答:


23

これは中心的な問題1554です。標準では、エイリアステンプレートのアクセスチェックがどのように実行されるかが明確ではありません(定義のコンテキストまたは使用のコンテキストで)。

現在の方向は、コードを整形式にする定義のコンテキストでチェックすることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.