Следует ли это компилировать?

У меня такой код:

#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).

Должен ли он компилироваться или нет?


person DarthRubik    schedule 12.03.2018    source источник
comment
Если я передам его в gcc с -std=c++17, он компилируется. Он также компилируется с магистралью gcc   -  person Justin    schedule 12.03.2018


Ответы (1)


Я думаю, он должен компилироваться как есть, потому что имя функции должно быть видно. Однако это исправляет:

    struct inner { 
        static auto getThing()
        {
            return std::integral_constant<T_& (*)(void*),&inner::impl_0>();
        }
    };
person SergeyA    schedule 12.03.2018