Клас не може отримати доступ до свого приватного статичного методу constexpr - помилка Clang?


28

Цей код не компілюється в 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 .


3
Мабуть, додавання friend int main();перешкоджає Кланг скаржитися.
HolyBlackCat

2
Смішно! Однак перевірку доступу безумовно слід проводити з "дозволами" Outer<42>, ні main- правда? Зараз ще більше схожий на помилку на мене.
Лукас Барт

Чи std::result_ofзамість цього використовується робота?
Брендон

FWIW, Також працює в ICC та MSVC.
ChrisMM

Відповіді:


23

Це основне питання 1554 року . Стандартом незрозуміло, як здійснюється перевірка доступу для шаблонів псевдонімів (у контексті визначення або в контексті використання).

Поточний напрямок - це перевірка в контексті визначення, яке б зробило ваш код добре сформованим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.