【问题标题】:Class can't access its own private static constexpr method - Clang bug?类无法访问其自己的私有静态 constexpr 方法 - Clang 错误?
【发布时间】:2020-05-09 23:46:54
【问题描述】:

这段代码不能在 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's compiler explorer 上玩弄代码。

【问题讨论】:

  • 显然添加 friend int main(); 可以阻止 Clang 抱怨。
  • 好笑!但是,访问检查绝对应该使用Outer&lt;42&gt; 的“权限”进行,而不是main - 对吧?现在对我来说更像是一个错误。
  • 使用std::result_of 可以代替吗?
  • FWIW,也适用于 ICC 和 MSVC。

标签: c++ language-lawyer c++17 clang++


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-03-28
    • 2021-11-13
    • 1970-01-01
    • 2014-08-31
    • 2017-01-01
    • 2011-03-14
    • 2015-12-29
    • 2011-07-04
    • 2013-03-08
    相关资源
    最近更新 更多