模板推演失败
Template deduction failure
我正在尝试从 boost 库中实现绑定功能。
下面你可以看到定义了 operator()
.
的主结构 bind_t
我的问题如下:为什么我们要在返回类型operator()
中的decltype中明确指定返回类型call()
作为成员函数(如果我在[=之前删除this->
16=], 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...);
}
};
这是一个 gcc 错误,记录在错误报告 decltype needs explicit 'this' pointer in member function declaration of template class with trailing return type 中说:
When using trailing return-type for member functions of a template
class, the 'this' pointer must be explicitly mentioned. This should
not be necessary (The implicit 'this' works with a non-template
class).
Example:
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)。
我正在尝试从 boost 库中实现绑定功能。
下面你可以看到定义了 operator()
.
bind_t
我的问题如下:为什么我们要在返回类型operator()
中的decltype中明确指定返回类型call()
作为成员函数(如果我在[=之前删除this->
16=], 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...);
}
};
这是一个 gcc 错误,记录在错误报告 decltype needs explicit 'this' pointer in member function declaration of template class with trailing return type 中说:
When using trailing return-type for member functions of a template class, the 'this' pointer must be explicitly mentioned. This should not be necessary (The implicit 'this' works with a non-template class).
Example:
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)。