类无法访问自己的私有静态 constexpr 方法 - Clang 错误?

Luk*_*rth 28 c++ language-lawyer clang++ c++17

这段代码不能在 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;
}
Run Code Online (Sandbox Code Playgroud)

叮当告诉我:

<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'
Run Code Online (Sandbox Code Playgroud)

......这当然是,但我尝试访问该成员同一类。我不明白为什么它不应该在那里访问。我是否遇到了(我应该提交)Clang 错误?

您可以在Godbolt 的编译器资源管理器玩弄代码。

T.C*_*.C. 23

这是核心问题 1554。该标准不清楚如何对别名模板执行访问检查(在定义的上下文中,或在使用的上下文中)。

当前的方向是在定义的上下文中进行检查,这将使您的代码格式良好。