注意:我打开了一个问题,但我想确保我的代码也是有效的.
我试图回复another answer,而在玩羊羔和继承时发现了一些困难.
考虑以下几个最小例子:
template<typename Func> struct Base: Func { Base(Func func): Func{func} {} template<typename... Args> auto operator()(Args... args) -> decltype(Func::operator()(args...),void()) { Func::operator()(args...); } }; int main() { auto l = [](auto &&) {}; Base<decltype(l)> mixin{l}; mixin(0); }
GCC 6.1 compiles it,clang 4.0 crashes.
注意,使用以下定义,两个编译都很好:
auto l = [](int) {};
这个有效的代码是否正在做标准不允许的事情?
@R_404_323@
只要你需要一个解决方案的clang – 以下代码应该与clang配合使用
#include <utility> #include <iostream> template <typename F> struct Base : F { Base (F f) : F {f} {} template <typename... Args> decltype(auto) operator () (Args&&... args) { std::cout << "("; F::operator () (std::forward<Args> (args)...); std::cout << ")" << std::endl; } }; int main () { auto l = [] (auto && i) { std::cout << i; }; Base<decltype(l)> mixin {l}; mixin (0); return 0; }