是编译器还是我自己:继承自 lambdas 组成的可变参数模板
Posted
技术标签:
【中文标题】是编译器还是我自己:继承自 lambdas 组成的可变参数模板【英文标题】:Is it the compiler or just me: Inheriting from variadic template consisting of lambdas 【发布时间】:2015-03-12 02:34:25 【问题描述】:我有一些代码可以在 GCC 下工作,但无法在 Visual Studio 2015 下编译(我意识到这是在开发中,但我认为应该实现这个区域)。
template< typename... T >
class inherit : public T...
public:
inherit(T... t) : T(t)...
;
int main()
auto l1 = []() ;
auto l2 = []() ;
inherit<decltype(l1), decltype(l2)> test(l1, l2);
return 0;
这就是代码 sn-p 简化为它的纯粹本质。 Visual Studio 在继承的构造函数上说“语法错误:'type'”。然后它会吐出一点关于它是如何到达那里的痕迹,并以“你不能构造 lambda 的实例”作为结尾。
我的假设是 T(t)... 的扩展没有正确扩展。但是我很可能会弄错语法。
编辑:对不起,问题是:我在这里有错吗?如果是这样,正确的语法是什么?
附加发现:根据我收到的回复,这似乎是 Visual Studio 2015 在这方面存在错误的问题。在测试中,似乎将构造函数参数传递给存在问题的 lambda 基类的扩展。以下测试在 VS2015 下工作:
template< typename T1, typename T2, typename... T3 >
class inherit2 : public T3...
public:
inherit2(T1 t1, T2 t2) : T1(t1), T2(t2)
;
int main()
auto l1 = []() ;
auto l2 = []() ;
inherit2<decltype(l1), decltype(l2), decltype(l1), decltype(l2)> test(l1, l2);
return 0;
【问题讨论】:
看起来不错,clang++ 也接受它。当您删除可变性但保留 lambda 时会发生什么? 我认为 Visual Studio 在某些情况下传递 lambda 时会出现问题 connect.microsoft.com/VisualStudio/feedback/details/727957/… ***.com/questions/25777396/… 您的代码从 gcc 4.6 和 clang 3.1 开始就被支持(都是从 2012 年初开始的)。 Visual C++ 在这方面落后了 3 年。 @dyp 失败需要可变参数。经过更多的混乱之后,似乎是 T(t)... 扩展,用于将参数传递给导致问题的基本构造函数。我将根据发现编辑我的帖子,以防其他人在遇到相同问题时偶然发现此问题。 顺便说一句,由于 C++ 中没有using Ts::operator()...;
语法,如果你想创建一个“lambda 的覆盖”类型,你必须通过树或线性继承.顺便说一句,您在“VS2015 中的作品”示例中缺少: public T1, public T2
?
【参考方案1】:
这是编译器。 more recent MSVC, v. 19.00.23106.0 从 2015 年 7 月开始,按原样接受您的示例。
也许大括号初始化语法Tt...
会有所帮助。不过,我找不到合适的在线编译器来尝试。
【讨论】:
以上是关于是编译器还是我自己:继承自 lambdas 组成的可变参数模板的主要内容,如果未能解决你的问题,请参考以下文章