我正在寻找一种从模板函数中的其他lambda识别空(无捕获)lambda的方法。我目前正在使用C ++ 17,但我也对C ++ 20的答案感到好奇。
我的代码如下所示:
template<typename T>
auto func(T lambda) {
// The aguments of the lambdas are unknown
if constexpr (/* is captureless */) {
// do stuff
}
}
C ++标准(17或20)是否保证可转换为函数指针的不可捕获lambda也会使std::is_empty
yield 变为true?
以以下代码为例:
auto a = []{}; // captureless
auto b = [c = 'z']{}; // has captures
static_assert(sizeof(a) == sizeof(b)); // Both are the same size
static_assert(!std::is_empty_v<decltype(b)>); // It has a `c` member
static_assert(std::is_empty_v<decltype(a)>); // Passes. It is guaranteed?
@HolyBlackCat我曾考虑过这一点,但据我所记得,MSVC不允许这样做,因为它们使转换运算符重载了。
—
Guillaume Racicot
@GuillaumeRacicot MS为所有可用的调用约定公开了单独的转换运算符。只需选择一个并尝试将lambda转换为可比较的函数指针,然后检查它是否成功。
—
雷米·勒博
+
似乎在这里工作。
+lambda
)的转换是否格式正确。