2

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

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

Clang 和 GCC 会接受这个,但是 MSVC 会抱怨这个消息

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

是否有一种解决方法可以强制 2 个参数类型相等?

注意:这个问题可以用 Visual Studio 2015、2017 和 Pre-2018 重现

在编译器资源管理器上查看此代码(您可以在不同的编译器之间切换)


编辑:

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

所以,@nm 和@max66 的答案都是正确的:第一个是如果你想强制类型相等,第二个是如果你想使用 is_convertible。

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

4

2 回答 2

3

不完全是你问的,但是......也许你可以将它强加在 lambda 中,使用另一个 lambda

auto f2 = [] (auto x, auto y)
 { return [](decltype(x) a, decltype(x) b) {return a + b;}(x, y); };
于 2018-08-01T20:51:27.577 回答
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 出于某种原因在其上)。

于 2018-08-01T20:53:17.720 回答