Цей код не компілюється в Clang (6,7,8,9, магістраль), але просто добре поєднується в 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;
}
Кланг каже мені:
<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();
перешкоджає Кланг скаржитися.