- 主题:lambda到底算不算variable?
template<class T>
void f(T&& a)
{
static_assert(std::is_rvalue_reference_v<decltype(a)>);
}
void g(int&& i)
{
}
int main()
{
auto test_lambda = [](){}
int i = 0;
auto test = [l{std::move(test_lambda)}, j{i}]()
{
f(std::move(l)); // pass compilation, pass static_assert;
g(std::move(j)); // fail, can't cast const int to int&&
}
}
l虽然也value-capture, 但是不受lambda的const限制,j确受到限制。查了很多地方没有说为什么,查了仔细都了lambda的标准,也没有明确说,唯一可以解释的地方就是"lambda is a closure",所以lambda和functor还是有区别。
--
FROM 60.191.0.*
搞清楚了,还是不能什么都信AI, 最后查了一堆生僻资料,发现 lambda move过去以后居然是一个const rvaluve reference,居然存在这种东西。 所以把g改成g(const int&&)就可以了。真是活久见,居然有const rvalue reference这种精神变态的定义。chatgpt关于副本是没有const属性是正确的,const属性是在operator() const上,但是结论错了
--
FROM 115.205.71.*
但是,事实上,const rvalue reference最后还是bind到const lvalue reference的ctor,所以即使是std::move过去的,也是一个copy
--
FROM 115.205.71.*
但是另一方面,加了mutable以后,lambda的调用会变成一个function pointer,不再有任何的关于inline的编译器优化,在性能方面会有所降低。chatgpt这种不同问法有不同答案的,真的还是需要自己在细节上再查下资料
【 在 z16166 的大作中提到: 】
: AI需要合适的hint/诱导
: Q:
: 那么std::move(j)传给g(int &&)无法编译,但是传递给g(const int &&)却可以编译,是因为lambda默认是const的吗?
: ...................
--
FROM 115.205.71.*
所有的模板库里,原来检测必须用move ctor的地方都是用 is_rvalue_reference_v,现在好了const rvalue reference一样能通过is_rvalue_reference_v检测,但是最后给我用copy ctor。吐血了,用same_as<std::decay_t<T>, T>重新检测了一下,结果一堆地方全是copy ctor
--
FROM 115.205.71.*
看代码构架了,如果lambda本身再被capture by value,再另外的lambda里运行,就带const限定了,那么non-const operator() 就只能被当作function pointer调用了。
【 在 z16166 的大作中提到: 】
: 加mutable不应该有这个后果呀
:
--
FROM 60.191.0.*