__declspec(noinline) 模板内的 lambda 函数 class 在 VS2017 中抛出语法错误

__declspec(noinline) on lambda function inside template class throws syntax error in VS2017

在尝试使用断言宏调试问题时,我遇到了这个问题。在模板 class 中的 lambda 函数上使用 __declspec(noinline) 在 Visual Studio 2017 中生成语法警告:

error C2760: syntax error: unexpected token '__declspec', expected '{'

这是失败的代码:

template<class R>
class test
{
public:
    void DoStuff()
    {
        []() __declspec(noinline) { }; // syntax error
    }
};

int WinMain(void)
{
    return 0;
}

如果我转到我的项目设置并在项目属性对话框的常规部分将我的平台工具集从 v141 (vs2017) 切换到 v140 (vs2015),错误就会消失。

如果我将 class 更改为不是模板 class 它也可以正确编译:

class test
{
public:
    void DoStuff()
    {
        []() __declspec(noinline) { }; // compiles fine
    }
};

int WinMain(void)
{
    return 0;
}

我很好奇为什么使用 v141 平台工具集无法成功。是否有其他一些项目设置可能会对此产生影响?

它在 VC++ 2019 年有效,所以可能只是 2017 年的倒退?

我可以通过将 Visual Studio 2017 更新到最新版本 (15.9.7) 来解决此问题。之前我是运行版本15.6.7。感谢所有看过并发表评论的人! :)