模板扣除失败

时间:2015-12-28 00:47:33

标签: c++ templates gcc variadic-templates sfinae

我试图从boost库中实现bind函数。 您可以在下面看到定义为bind_t的主结构operator()

我的问题如下:为什么我们应该在decltype中指定operator()返回类型的call()显式为成员函数(如果我在{{1}之前删除this-> },模板参数推导在g ++中失败。)

同样有趣的是,使用clang ++并没有这样的问题。

我不知道,为什么会这样。

call
实施的{p> full source simple usecase

1 个答案:

答案 0 :(得分:2)

这是一个gcc错误,并在错误报告decltype needs explicit 'this' pointer in member function declaration of template class with trailing return type中记录,其中包含:

  

对模板的成员函数使用trailing return-type时   上课,这个'必须明确提到指针。这应该   没有必要(隐含的'这'适用于非模板   类)。

     

示例:

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中工作( see it live )。