C++ 是否保证未命名的 lambda class 始终定义了 "operator bool()"?
Does C++ guarantee the lambda unnamed class always has an "operator bool()" defined?
#include <type_traits>
int main()
{
auto f = [] {};
static_assert(std::is_same_v<decltype(!f), bool>); // ok
f.operator bool(); // error: ‘struct main()::<lambda()>’
// has no member named ‘operator bool’
}
C++ 是否保证未命名的 lambda class 总是有一个 operator bool()
定义?
没有,lambdas 没有 operator bool()
。
!f
之所以有效,是因为没有捕获的 lambda 可以转换为函数指针(它有一个转换运算符),然后可以转换为 bool
,其值为 true
,因为指针不为空。
另一方面,
int x;
auto f = [x] {};
!f; // not work; lambdas with captures can't convert to function pointer (and bool)
#include <type_traits>
int main()
{
auto f = [] {};
static_assert(std::is_same_v<decltype(!f), bool>); // ok
f.operator bool(); // error: ‘struct main()::<lambda()>’
// has no member named ‘operator bool’
}
C++ 是否保证未命名的 lambda class 总是有一个 operator bool()
定义?
没有,lambdas 没有 operator bool()
。
!f
之所以有效,是因为没有捕获的 lambda 可以转换为函数指针(它有一个转换运算符),然后可以转换为 bool
,其值为 true
,因为指针不为空。
另一方面,
int x;
auto f = [x] {};
!f; // not work; lambdas with captures can't convert to function pointer (and bool)