具有两个相同类型的自动参数的MSVC lambda

时间:2018-08-01 19:46:40

标签: visual-studio templates lambda c++14 generic-lambda

在给出以下代码的情况下,Visual Studio的行为似乎不同于GCC和Clang:

auto f2 = [](auto x, decltype(x) y)
{
  return x + y;
};
f2(1, 2);

Clang和GCC会接受,但MSVC会显示以下消息

  

错误C3536:“ x”:在初始化之前无法使用

是否存在变通方法以强制2个参数类型相等?

Nb:此问题可以在Visual Studio 2015、2017和2018之前的版本中重现

请参见this code on compiler explorer(您可以在其中切换不同的编译器)


编辑:

此代码的行为并非阅读时所期望的:只要decltype(y)可转换为decltype(x),且不仅限于相等时,它将编译。

所以,两个@ n.m。和@ max66答案是正确的:第一个是如果要强制类型相等,第二个是如果要使用is_convertible。

我接受了第二个,因为它保留了原始代码的行为(尽管原始代码可能是错误的:在我的情况下,对类型相等性的比较更好)

2 个答案:

答案 0 :(得分:3)

并非完全是您的要求,但是...也许您可以使用另一个lambda将其强加到lambda中

auto f2 = [] (auto x, auto y)
 { return [](decltype(x) a, decltype(x) b) {return a + b;}(x, y); };

答案 1 :(得分:1)

auto f2 = [](auto x, auto y)
{
  static_assert(std::is_same<decltype(x), decltype(y)>::value, 
                "Argument types must be the same");
  return x + y;
};

要更忠实地模拟原始行为,可以尝试使用is_convertible而不是is_same(但是出于某些原因,某些MSVC版本是ICE)。