【发布时间】: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<42>的“权限”进行,而不是main- 对吧?现在对我来说更像是一个错误。 -
使用
std::result_of可以代替吗? -
FWIW,也适用于 ICC 和 MSVC。
标签: c++ language-lawyer c++17 clang++