このコードは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のコンパイラーエクスプローラーでコードをいじることができます。
おかしい!しかし、アクセスチェックは間違いなくの「許可」で行われるべきです-そうで
—
Lukas Barth
Outer<42>
はありませんmain
か?私にとっては、さらにバグのように見えます。
使用しない
—
ブランドン
std::result_of
代わりに仕事を?
FWIW、ICCおよびMSVCでも動作します。
—
ChrisMM
friend int main();
はClangが文句を言うのを止めます。