鉴于以下代码,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。
我接受了第二个,因为它保留了原始代码行为(尽管原始代码可能是错误的:在我的情况下,类型相等的比较更好)