模板类中的lambda函数上的__declspec(noinline)在VS2017中引发语法错误

时间:2019-04-23 04:00:45

标签: c++ templates visual-c++ lambda declspec

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

  

错误C2760:语法错误:意外令牌'__declspec',预期为'{'

这是失败的代码:

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

int WinMain(void)
{
    return 0;
}

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

如果我将类更改为非模板类​​,则它也可以正确编译:

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

int WinMain(void)
{
    return 0;
}

我很好奇为什么使用v141平台工具集无法成功。还有其他项目设置可能会影响这一点吗?

2 个答案:

答案 0 :(得分:0)

它在VC ++ 2019中有效,所以可能只是2017年的回归?

答案 1 :(得分:0)

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