Lambda的捕获条款存在问题

时间:2019-12-16 13:20:55

标签: c++ c++11

我正在尝试使用ftw函数来计算目录的大小。 ftw函数的原型是:

int ftw(const char *dirpath,
        int (*fn) (const char *fpath, const struct stat *sb,
                   int typeflag),
        int nopenfd);

要计算整个目录的大小,我尝试使用以下代码使用lambda表达式:

uint32_t calcDirSize(const char *path) {
   uint32_t usize = 0;

   if (ftw(path, [&usize](const char *fpath, const struct stat *sb, int typeflag) {
                     usize += sb->st_size;
                     return 0;
             }, 1)) {
    return 0;
   }

   return usize;
}

lambda表达式的capture子句中的变量抛出错误。我想使用局部变量来计算大小,并在计算后从calcDirSize函数返回。 还有其他方法可以达到相同的结果吗?

1 个答案:

答案 0 :(得分:3)

lambda仅在无状态的情况下才可以转换为功能指针,换句话说,不能捕获任何东西。

仅允许在lambda之外的变量使用没有捕获的静态变量。

uint32_t calcDirSize(const char *path) {
   static uint32_t usize = 0;
   usize = 0; // Make sure it's reset to 0 every time the function is called.


   if (ftw(path, [](const char *fpath, const struct stat *sb, int typeflag) {
                     usize += sb->st_size;
                     return 0;
             }, 1)) {
    return 0;
   }

   return usize;
}

通过将usize设为静态,我们可以删除lambda中的捕获,并将其转换为函数指针。

编辑:正如评论中指出的那样,这不是线程安全的,因为多次调用calcDirSize可以同时修改/读取usize