30/09/2018, 20:11
Em không hiểu dấu && trong đoạn code dưới, Cao nhân nào chỉ giáo em với
template <class Fn, class... Args,
class = typename std::enable_if<
!std::is_same<typename std::decay<Fn>::type,
my_thread>::value>::type>
explicit my_thread (Fn&& fn, Args&&... args)
: thread(std::forward<Fn>(fn), std::forward<Args>(args)...) { }
Bài liên quan
Là reference tơi rvalue. rvalue không thể thay đổi giá trị, nhưng reference thì thay đổi được.
Bác có thể lấy ví dụ cho em dễ hiểu hơn được không. Lơ tơ mơ quá. Tks ạ
Trước hết, trong C++ có 2 khái niệm rvalue (right) và lvalue (left). lvalue tham chiếu tới 1 object tồn tại, còn rvalue là một giá trị tạm thời và sẽ bị clear khi ra khỏi context dùng nó.
Giờ chúng ta nói về reference, có 2 loại reference left (&) và right (&&)
Left reference (Cái này khá dễ hiểu, đại khái reference là address của object)
Output: Bill is 40.
Right reference:
Cái này được đưa ra để dùng cho một trường hợp gọi là “move semantic”
Giả sử phép toán này: string s = string(“h”) + “e” + “f” + “g”;
Trước C++11, phép + đầu tiên sẽ trả về một rvalue tạm (ở đây sẽ là chuỗi “he”), phép cộng tiếp theo do rvalue tạm đã bị clear nên nó sẽ hông biét được string gốc giờ là lvalue hay rvalue. Nếu là rvalue thì nó không thể bị thay đổi. Giải quyết sao?
Một ví dụ nữa về việc insert 1 element vào Vector. Giờ giả sử không có khái niệm right reference, nếu dung lượng Vector hết, Vector sẽ phải phân bổ lại memory để nhét được thêm element mới vào, gọi copy constructor để copy đống element cũ sang bên Vector mới, destroy element cũ, destroy memory Vector cũ, … chà chà, khá là tốn memory (gấp 2) và một loạt thao tác thừa (copy). Nếu có có khái niệm right reference, Vector sẽ được phân bổ động memory và do đó không cần thao tác copy luôn ^^
Giờ muốn gọi cái factory này thì chúng ta phải làm thế này:
chứ nếu gọi
Giải pháp:
Hàm std::forward dùng để forward/move params sang constructor của class. Ngắn hơn được 2 dòng ^^
B1: khai báo 1 template, với constructor được build từ 1 object Fn (constructor) và các arguments động (truyền bao nhiêu vào cũng được). enable_if loại bỏ constructor sử dụng overload.
B2: khai báo my_thread sử dụng right reference để nó forward sang template constructor.
chà kiến thức hay quá giờ mới biết có sự tồn tại của rvalue reference