类无法访问其自己的私有静态constexpr方法-lang虫?


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;
}

lang告诉我:

<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

Answers:


23

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

当前的方向是检查定义的上下文,这将使您的代码格式正确。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.