这段代码不能在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的编译器浏览器中玩弄代码。
滑稽!但是,访问检查绝对应使用的“权限”进行
—
卢卡斯·巴斯
Outer<42>
,不是main
吗?现在看起来对我来说更像是个虫子。
使用
—
布兰登
std::result_of
工作代替吗?
FWIW,也可在ICC和MSVC中使用。
—
ChrisMM
friend int main();
阻止Clang抱怨。