Mã này không biên dịch trong Clang (6,7,8,9, trung kế), nhưng chỉ biên dịch tốt trong 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 nói với tôi:
<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'
Tất nhiên là vậy, nhưng tôi đang cố gắng truy cập thành viên đó từ trong cùng một lớp. Tôi không thấy lý do tại sao nó không thể truy cập được ở đó. Tôi đã nhấn (và tôi có nên nộp) một lỗi Clang không?
Bạn có thể chơi đồ chơi với mã tại trình thám hiểm trình biên dịch của Godbolt .
Buồn cười! Tuy nhiên, kiểm tra truy cập chắc chắn phải được thực hiện với "quyền"
—
Lukas Barth
Outer<42>
, không main
- phải không? Bây giờ thậm chí trông giống như một lỗi với tôi.
Có sử dụng
—
Brandon
std::result_of
công việc thay thế?
FWIW, Cũng hoạt động trong ICC và MSVC.
—
ChrisMM
friend int main();
ngăn chặn Clang phàn nàn.