У меня такой код:
#include "type_traits"
template<typename T_>
struct thing{
template<typename me_type>
struct inner {
static T_& impl_0 (void* me ) { return static_cast<me_type*>(me )->operator*(); }
static auto getThing()
{
return std::integral_constant<T_& (*)(void*),&impl_0>();
}
};
};
Он объявляет статическую функцию внутри шаблонного класса, который находится внутри другого шаблонного класса.
Затем он объявляет автоматическую функцию, которая возвращает указатель на эту функцию, но сначала помещает его в std::integral_constant
Когда я передаю это gcc версии 7.3 (godbolt) с флагами компилятора -std=c++14
, он жалуется:
<source>: In static member function 'static auto thing<T_>::inner<me_type>::getThing()':
<source>:11:69: error: template argument 2 is invalid
return std::integral_constant<T_& (*)(void*),&impl_0>();
Но когда я даю ему clang версии 6.0.0, он компилируется нормально (godbolt).
Должен ли он компилироваться или нет?
-std=c++17
, он компилируется. Он также компилируется с магистралью gcc - person Justin   schedule 12.03.2018