Обнаружение на основе SFINAE с использованием классов void_t и защищенного гнезда

Я недавно столкнулся с некоторым расхождением между Clang и GCC в отношении void_t обнаружение свойств и информация защищенного / частного класса. Рассмотрим черту типа, определенную следующим образом:

#include <type_traits>

template<typename T, typename = void>
constexpr const bool has_nested_type_v = false;

template<typename T>
constexpr const bool has_nested_type_v
<T, std::void_t<typename T::type>> = true;

Даны примеры типов с защищенным или закрытым type классы и простая программа

#include "has_nested_type.hpp"#include <iostream>

struct Protected {
protected:
struct type{};
};

struct Private {
private:
struct type{};
};

int main() {
std::cout << "Protected: "<< (has_nested_type_v<Protected> ? "detected" : "not detected")
<< std::endl;
std::cout << "Private: "<< (has_nested_type_v<Private> ? "detected" : "not detected")
<< std::endl;
}
  • clang успешно компилируется с ошибкой обнаружения (как и ожидалось). Программа, компиляция и вывод воспроизводятся на wandbox Вот.

  • GCC не может скомпилировать, выдав диагностику. Эта ошибка может быть воспроизведена на wandbox Вот.

GCC выдает следующую ошибку для этой программы.

prog.cc:16:21: error: 'struct Protected::type' is protected within this context
<< (has_nested_type_v<Protected> ? "detected" : "not detected")
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.cc:6:14: note: declared protected here
struct type{};
^~~~
prog.cc:19:21: error: 'struct Private::type' is private within this context
<< (has_nested_type_v<Private> ? "detected" : "not detected")
^~~~~~~~~~~~~~~~~~~~~~~~~~
prog.cc:11:14: note: declared private here
struct type{};
^~~~

У меня вопрос, какое поведение стандартно соответствует? Должен ли здесь произойти ошибка и выдать диагностическое сообщение, или GCC чрезмерно стремится?

7

Решение

Это Ошибка GCC. Это часть следующий мета-баг это описывает несколько ошибок, связанных с доступом.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]