클래스가 자체 정적 정적 constexpr 메소드에 액세스 할 수 없습니다-Clang bug?


28

이 코드는 Clang (6,7,8,9, 트렁크)에서 컴파일되지 않지만 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못했습니다 -? 지금은 나에게 더 벌레처럼 보인다.
루카스 바스

사용 않는 std::result_of대신 일을?
브랜든

FWIW, ICC 및 MSVC에서도 작동합니다.
ChrisMM

답변:


23

이것이 핵심 이슈 1554 입니다. 표준은 별칭 정의 템플릿 (정의 컨텍스트 또는 사용 컨텍스트)에 대한 액세스 확인이 어떻게 수행되는지 명확하지 않습니다.

현재 방향은 정의의 맥락에서 확인하여 코드를 올바르게 만드는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.