在 MSVC C++ 中强制内联 lambda

问题描述 投票:0回答:1

接下来的代码在 CLang/GCC 中编译,并成功内联 lambda:

在线尝试!

#include <iostream>

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

但最新 MSVC (2019 v16.8.3) 中与

__forceinline
类似的代码无法编译,尽管已宣布 在 v16.7 中实现:

在线尝试!

#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)中是否有任何方法可以不编译代码(并抛出编译错误)?

__attribute__((always_inline))
__forceinline
在所有 100% 的用例中也能保证 lambda 绝对是内联的吗?

c++ visual-c++ lambda visual-studio-2019 inline
1个回答
15
投票

根据 Jonathan Caves 对功能请求的回复,未来支持的语法是

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

哪个可以编译

看起来他们希望它符合 C++11 中引入的属性语法

© www.soinside.com 2019 - 2024. All rights reserved.