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