【问题标题】:Template type alias visibility compiler disagreement模板类型别名可见性编译器不一致
【发布时间】:2020-11-07 22:47:53
【问题描述】:

以下示例使用 gcc 编译,但不使用 clang。哪个编译器是正确的,为什么?

#include <utility>

struct Foo {

private:
    
    template<typename T>
    static int f();

public:

    template<typename U>
    using T = decltype(f<U>());

};


int main () {

    static_assert(std::is_same_v<Foo::T<float>, int>);
}

Clang 抱怨 'f' is a private member of 'Foo'。我认为这是不正确的,因为f 是从Foo 内部访问的,因此应该是可见的。有趣的是,如果T 不是模板,它就可以工作。

直播代码here.

【问题讨论】:

    标签: c++ templates language-lawyer


    【解决方案1】:

    这是clang bug,其中clang 无法解析成员别名模板中使用的名称的正确访问控制。

    question 是一个错误示例,其中好友类成员名称的访问控制解析不正确。

    在您的示例中,您有一个静态成员模板 f,为此我们只需要 temp.mem#2

    ... 访问控制规则适用于成员模板名称。 ...

    所以fT的声明中确实可见,代码有效。

    请注意,链接帖子中提到的修复在这里也有效,因为它是相同的错误:

    template<typename U, typename X = decltype(f<U>())>
    using T = X;  // ok
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 2020-11-13
      • 1970-01-01
      • 2016-06-01
      • 2019-04-28
      • 1970-01-01
      相关资源
      最近更新 更多