是编译器还是我:Inheriting from variadic template consisting of lambdas

Is it the compiler or just me: Inheriting from variadic template consisting of lambdas

我有一些代码可以在 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;
}

这就是代码片段的精髓所在。 Visual Studio 对 inherit 的构造函数说 "syntax error: 'type'"。然后它会喷出一点它是如何到达那里的痕迹并以 "you cannot construct an instance of a 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;
}

是编译器。 A more recent MSVC,v. 19.00.23106.0,从 2015 年 7 月开始,按原样接受您的示例。

也许大括号初始化语法 T{t}... 会有所帮助。不过,我找不到合适的在线编译器来尝试。