【发布时间】:2018-08-01 19:46:39
【问题描述】:
鉴于以下代码,Visual Studio 的行为似乎与 GCC 和 Clang 不同:
auto f2 = [](auto x, decltype(x) y)
{
return x + y;
};
f2(1, 2);
Clang 和 GCC 会接受这一点,但 MSVC 会抱怨该消息
error C3536: 'x': 在初始化之前不能使用
是否有一种解决方法可以强制 2 个参数类型相等?
注意:这个问题可以在 Visual Studio 2015、2017 和 Pre-2018 中重现
参见this code on compiler explorer(您可以在其中切换不同的编译器)
编辑:
这段代码的行为并不是人们在阅读它时所期望的:只要 decltype(y) 可转换为 decltype(x),它就会编译,而不仅仅是当它们相等时。
所以,@n.m. @max66 的答案是正确的:第一个是如果你想强制类型相等,第二个是如果你想使用 is_convertible。
我接受了第二个,因为它保留了原始代码行为(尽管原始代码可能是错误的:在我的情况下,比较类型相等性更好)
【问题讨论】:
标签: visual-studio templates lambda c++14 generic-lambda