Skip to content

Latest commit

 

History

History
78 lines (60 loc) · 2.33 KB

capture.md

File metadata and controls

78 lines (60 loc) · 2.33 KB

capture

💼 capture 是 Awacorn 用于实现在 C++ 11 进行移动构造/完美转发捕获的类型。

目录


awacorn::detail::capture_helper

💼 用于储存捕获。

#include <string>
#include <iostream>
#include "awacorn/detail/capture.hpp"
int main() {
  std::string a = "str";
  awacorn::detail::capture_helper arg_a = awacorn::detail::capture(std::move(a));
  ([arg_a]() mutable {
    std::string b = std::move(arg_a.borrow()); // 移动
  })();
}

📝 取自 borrow 的示例。

borrow

📂 借用工具类内的对象 (不可变左值引用/左值引用)。

#include <string>
#include <iostream>
#include "awacorn/detail/capture.hpp"
int main() {
  std::string a = "str";
  awacorn::detail::capture_helper arg_a = awacorn::detail::capture(std::move(a));
  ([arg_a]() {
    std::string b = arg_a.borrow(); // const std::string& 拷贝
  })();
  ([arg_a]() mutable {
    std::string b = std::move(arg_a.borrow()); // std::string& 移动
  })();
}
  • 🚫 在 capture_helper 为不可变的情况下,borrow 只会返回不可变左值引用,不能用于移动构造。
  • ✅ 在 capture_helper 为可变的情况下,borrow 会返回左值引用,可用于移动构造。
    • 🔰 若需要将捕获值变为可变,请在函数的 ->(显式指定返回值) 或者 {(自动推导返回值) 前加入 mutable

awacorn::detail::capture

📂 完美转发一个对象到工具类。

#include <string>
#include <iostream>
#include "awacorn/detail/capture.hpp"
int main() {
  std::string a = "str";
  awacorn::detail::capture_helper arg_b = awacorn::detail::capture(a); // 复制
  awacorn::detail::capture_helper arg_b = awacorn::detail::capture(std::move(a)); // 移动
}
  • 🔰 若想要移动一个对象需要显式指定 std::move,否则会拷贝对象。

注意事项

⚠️ awacorn::detail 命名空间内的成员均是 Awacorn 的 内部类,擅自使用会导致 可移植性降低,并且我们也不推荐这么做。