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

Visual studio 具有两个相同类型的自动参数的MSVC lambda,visual-studio,templates,lambda,c++14,generic-lambda,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”:在初始化之前无法使用 是否有一种变通方法来强制两种参数类型相等 注意:这个问题可以在Visual Studio 2015、2017和2018年之前重现 请参阅(您可以在不同的编译器之间切换) 编辑:

鉴于以下代码,Visual Studio的行为似乎与GCC和Clang不同:

auto f2 = [](auto x, decltype(x) y)
{
  return x + y;
};
f2(1, 2);
Clang和GCC将接受这一点,但MSVC将对此消息进行投诉

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

是否有一种变通方法来强制两种参数类型相等

注意:这个问题可以在Visual Studio 2015、2017和2018年之前重现

请参阅(您可以在不同的编译器之间切换)


编辑:

这段代码的行为并不是人们在阅读它时所期望的:它将在decltype(y)转换为decltype(x)时编译,而不仅仅是在它们相等时

因此,@n.m.和@max66答案都是正确的:第一个是如果你想强制类型相等,第二个是如果你想使用is_可转换


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

不完全是您所要求的,但是。。。也许你可以在lambda中使用另一个lambda

auto f2 = [] (auto x, auto y)
 { return [](decltype(x) a, decltype(x) b) {return a + b;}(x, y); };
auto f2=[](自动x、自动y)
{
静态断言(std::is_same::value,
“参数类型必须相同”);
返回x+y;
};

为了更忠实地模拟原始行为,您可以尝试使用
is\u convertible
而不是
is\u same
(但某些MSVC版本出于某种原因而使用它)

好主意!但是在这种情况下,
f2('c',2)
将编译(比较char和int)。@PascalT对但是
f2('c',2)
也将编译
[](自动x,decltype(x)y)
(巴里纠正了我这一点)。如果您希望
f2('c',2)
不编译,这是另一种类型的问题。您是对的。原始代码使用f('c',2)正确编译。我不知道这是不是有意的,不过:我正在将一些代码移植到windows,我需要检查代码的原始意图。很好!我喜欢它,因为我们有一个额外的好处,即在类型错误的情况下有一个更人性化的编译器输出。根据我的说法,您的答案和@max66都是正确的!
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;
};