【问题标题】:Lambda capture (by value) of array is only copying the pointer?数组的 Lambda 捕获(按值)只是复制指针?
【发布时间】:2021-09-15 17:51:20
【问题描述】:

我正在尝试(按值)捕获整个 C 样式数组。数组似乎衰减到一个指针......我该如何防止这种情况,以便捕获整个数组?

代码:

#include <iostream>

int main()
{
    char x[1024];

    std::cerr << sizeof(x) << "\n";
    [x = x] // copy
    {
        std::cerr << sizeof(x) << "\n";
    }();
}

打印出来:

1024  <<-- yay
8     <<-- oops... not a true copy

应该注意的是,这如我所愿(两个结果均为 1024):


#include <iostream>
#include <array>

int main()
{
    std::array<char, 1024> x;

    std::cerr << sizeof(x) << "\n";
    [x = x] // copy
    {
        std::cerr << sizeof(x) << "\n";
    }();
}

【问题讨论】:

  • 数组是 C++ 的二等公民。他们拒绝被复制,大概是因为很久以前它会被认为是不寻常的,并且可能是一个错误。我不知道它会衰减为 lambda 捕获中的指针,但这对我来说并不奇怪。如果你想要 C++ 中的 array 对象,我建议坚持使用 std::array,这很少会让人感到意外。

标签: c++ pointers lambda capture


【解决方案1】:

[x = x]

这个等于

auto x1 = x;

这实际上是衰减到一个指针。

只需将您的 lambda 捕获更改为 [x] 即可按值捕获 x。您也可以通过[&amp;x] 引用来捕获它。

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多