在 MSVC C++ 中强制内联 lambda
Forcing inlining of lambda in MSVC C++
下一个代码在 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
类似的代码无法编译,尽管已宣布 as implemented in 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)中还有什么方法可以不编译代码(并抛出编译错误)?在所有 100% 的用例中,__attribute__((always_inline))
和 __forceinline
是否也保证 lambda 绝对是内联的?
根据功能请求 Jonathan Caves reply,今后支持的语法是
auto f = [&]() [[msvc::forceinline]] {
++x;
};
看起来他们希望它符合 C++11
中引入的 attributes syntax
下一个代码在 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
类似的代码无法编译,尽管已宣布 as implemented in 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)中还有什么方法可以不编译代码(并抛出编译错误)?在所有 100% 的用例中,__attribute__((always_inline))
和 __forceinline
是否也保证 lambda 绝对是内联的?
根据功能请求 Jonathan Caves reply,今后支持的语法是
auto f = [&]() [[msvc::forceinline]] {
++x;
};
看起来他们希望它符合 C++11
中引入的 attributes syntax