gpt4 book ai didi

c++ - 模板类型别名可见性编译器不一致

转载 作者:行者123 更新时间:2023-12-03 06:49:40 25 4
gpt4 key购买 nike

以下示例使用 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 .

最佳答案

这是一个 clang bug ,其中 clang 不解析成员别名模板中使用的名称的正确访问控制。
question是错误的一个示例,其中对 friend 类成员的名称的访问控制未正确解决。
在您的示例中,您有一个静态成员模板 f ,为此我们只需要 temp.mem#2

... Access control rules apply to member template names. ...


所以 fT 的声明中确实可见,并且代码有效。
请注意,链接帖子中提到的修复程序也适用于此处,因为它是相同的错误:
template<typename U, typename X = decltype(f<U>())>
using T = X; // ok

关于c++ - 模板类型别名可见性编译器不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64733158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com