Неуспешно приспадане на шаблона

Опитвам се да внедря функцията за свързване от библиотеката за повишаване. По-долу можете да видите основната структура bind_t с дефинирана operator().

Въпросът ми е следният: Защо трябва да посочим в decltype в връщащ тип на operator() връщащ тип на call() изрично като членска функция (ако премахна this-> преди call, дедукцията на аргумента на шаблона е неуспешна в g++.)

Също така е интересно, че при използване на clang++ няма такъв проблем.

Нямам идея защо се случва това.

template <typename F, typename  ... P>
struct bind_t {
private:
    std::tuple<typename holder<P>::type...> p;
    F func;
    template <size_t ... N, typename ... Args>
    auto call(index_list<N ...>, Args const& ... args) const -> decltype(func(std::get<N>(p)(args...)...)) {
        return func(std::get<N>(p)(args...)...);
    }
public:
    bind_t(F f, P ... p):
        p(std::move(p)...),
        func(std::move(f))
    {}
    template <typename ... Args>
    auto operator()(Args const& ... args) const -> decltype(this->call(typename indices_by_num<sizeof...(P)>::type(), args...)) {
        typename indices_by_num<sizeof...(P)>::type indices;
        return call(indices, args...);
    }
};

пълен източник на внедряване
обикновен случай на използване


person artem zholus    schedule 28.12.2015    source източник
comment
Изглежда, че е коригирано в gcc 5.1   -  person Shafik Yaghmour    schedule 28.12.2015


Отговори (1)


Това е грешка в gcc и е документирана в доклада за грешка decltype се нуждае от изричен указател 'this' в декларация на членска функция на шаблонен клас със завършващ тип връщане, който казва:

Когато използвате завършващ тип връщане за членски функции на шаблонен клас, указателят „този“ трябва да бъде изрично споменат. Това не би трябвало да е необходимо (имплицитното „this“ работи с нешаблонен клас).

Пример:

template <typename T>
struct DecltypeConstThis {

    T f() const { return T{}; }

    auto g() -> decltype(this->f()) { return this->f(); }
    auto h() const  ->  decltype(f()) { return f(); } // this should work the same as g() above (with implicit 'this')

};

struct Working {
    int f() const { return 0; }
    auto h() const -> decltype(f()) { return 0; }
};


int main() {

    Working w;
    w.h();

    DecltypeConstThis<int> d;
    d.g();
    d.h();

    return 0;
}

Докладът беше маркиран като коригиран и изглежда, че това работи, започва да работи в gcc 5.1 (вижте го на живо).

person Shafik Yaghmour    schedule 28.12.2015
comment
Ако нямате най-новите версии на gcc, можете да проверите с помощта на Wandbox и да видите коя версия започва да работи в. - person Shafik Yaghmour; 28.12.2015