在 MSVC C++ 中强制内联 lambda

Forcing inlining of lambda in MSVC C++

下一个代码在 CLang/GCC 中编译,并成功内联 lambda:

Try it online!

#include <iostream>

int main() {
    int x = 0;
    auto f = [&]() __attribute__((always_inline)) {
        ++x;
    };
    f();
    std::cout << x;
}

但最新 MSVC (2019 v16.8.3) 中与 __forceinline 类似的代码无法编译,尽管已宣布 as implemented in v16.7:

Try it online!

#include <iostream>

int main() {
    int x = 0;
    auto f = [&]() __forceinline {
        ++x;
    };
    f();
    std::cout << x;
}

抛出编译错误0305.cpp(5): error C3260: 'type': skipping unexpected token(s) before lambda body

是真的没有实现还是我用错地方了__forceinline?还有其他方法可以在 MSVC 中强制内联 lambda 吗?

如果在某些地方使用了给定的 lambda 而没有内联,那么在所有流行的编译器(例如 CLang/GCC/MSVC)中还有什么方法可以不编译代码(并抛出编译错误)?在所有 100% 的用例中,__attribute__((always_inline))__forceinline 是否也保证 lambda 绝对是内联的?

根据功能请求 Jonathan Caves reply,今后支持的语法是

auto f = [&]() [[msvc::forceinline]] {
    ++x;
};

哪个does compile

看起来他们希望它符合 C++11

中引入的 attributes syntax