【问题标题】:Forcing inlining of lambda in MSVC C++在 MSVC C++ 中强制内联 lambda
【发布时间】:2020-12-30 15:44:37
【问题描述】:

接下来的代码在 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)中是否有任何方法不编译代码(并引发编译错误)? __attribute__((always_inline))__forceinline 在所有 100% 的用例中是否也保证 lambda 肯定是内联的?

【问题讨论】:

    标签: c++ visual-c++ lambda visual-studio-2019 inline


    【解决方案1】:

    根据功能请求上的Jonathan Caves reply,未来支持的语法是

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

    哪个does compile

    看起来他们希望它符合 C++11 中引入的attributes syntax

    【讨论】:

    • 哇!谢谢。你知道在某个地方是否有一个列表(URL),列出了 MSVC 的所有可能的类似标准的属性,语法为 [[msvc:...]]
    • @Arty 不幸的是我找不到类似的东西。
    猜你喜欢
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 2019-02-04
    • 1970-01-01
    相关资源
    最近更新 更多