gpt4 book ai didi

c++ - 防止 lambda 的返回类型推导

转载 作者:行者123 更新时间:2023-12-03 00:55:47 25 4
gpt4 key购买 nike

由于自动推导从 lambda 返回的类型,下面的代码无法编译。

在没有尾随类型的情况下防止 C++14 语法术语中的这种推导的正确方法是什么?

编译错误与 test() 输入上的不兼容类型(右值)有关,该输入需要非常量引用

struct B {
int i;
};

struct A {
B &getB() { return b; }
private:
B b;
};

void test(B &b) {
b.i++;
}

int main() {
A a;

test([&a]() {
return a.getB();
});
return 0;
}

最佳答案

这里有两个问题。

<小时/>

首先,您实际上并没有调用 lambda,因此不是将返回值传递到 test ,你传递了函数对象,这显然是一个完全不兼容的类型!通过添加 () 来解决此问题在 lambda 后面调用它,从而将返回值传递给 test() .

[](){ return 42; } ();
// ^^ now the whole expression has value 42
<小时/>

其次,你是对的,推导出的返回类型将是 B ,不是B& ,并且临时对象不能绑定(bind)到非 const 的引用test(B&) 的参数.

解决这个问题的一种方法是使用尾随返回类型来强制引用:

    [&a]() -> B& { .... }

你似乎知道这一点,但不想这样做。为什么?

另一种选择是返回一个引用包装器,然后按值返回该包装器,但其行为类似于引用:

return std::ref(a.getB()));
<小时/>

另一个选择是更改 test能够接受一些暂时的。由于您需要它才能修改原始对象,因此您可以拥有 test采用指针或其他具有引用语义的类型(智能指针, std::reference_wrapper<B> ,使 B 在复制时具有引用语义,...)

void test(B* b) {
++(b->i);
}
...
test([&]() { return &a.getB(); } () );

学究请注意:我知道 ++(b->i) 中的括号并不是绝对必要的。我觉得更清楚了。

关于c++ - 防止 lambda 的返回类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58518534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com