它是编译器还是仅仅是我:继承自lambda所包含的可变参数模板

时间:2015-01-14 00:28:27

标签: templates c++11 lambda variadic visual-studio-2015

我有一些代码可以在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在继承的构造函数上说“语法错误:'type'”。然后它会稍微探讨它是如何到达那里的,并以“你无法构建一个lambda实例”结束。

我的假设是T(t)的扩展......没有正确扩展。但是我可能会错误地使用语法。

编辑:对不起,问题是:我在这里有错吗?如果是这样,那么正确的语法是什么?

其他发现:为了与我所拥有的回复保持一致,这似乎是Visual Studio 2015在此方面存在错误的问题。在测试中,它似乎是扩展,其中构造函数params被传递给具有问题的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;
}

1 个答案:

答案 0 :(得分:0)

它是编译器。 2015年7月起的more recent MSVC,v.9.00.23106.0,按原样接受您的示例。

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

相关问题