2016-04-28 13 views
9

Trong cuốn sách Scott Meyer Effective Modern C++ on page 167 (của phiên bản in), ông đưa ra ví dụ sau đây:Mục đích chuyển tiếp hoàn hảo cho Đối số có thể gọi trong biểu thức gọi?

auto timeFuncInvocation = [](auto&& func, auto&&... params) { 
    // start timer; 
    std::forward<decltype(func)>(func)(
    std::forward<decltype(params)>(params)... 
); 
    // stop timer and record elapsed time; 
}; 

tôi hoàn toàn hiểu được chuyển tiếp hoàn hảo của params, nhưng nó là không rõ ràng với tôi khi chuyển tiếp hoàn hảo của func sẽ bao giờ được liên quan, thích hợp. Nói cách khác, là những gì những ưu điểm của các bên trên qua như sau:

auto timeFuncInvocation = [](auto&& func, auto&&... params) { 
    // start timer; 
    func(
    std::forward<decltype(params)>(params)... 
); 
    // stop timer and record elapsed time; 
}; 
+5

Khi 'func' có toán tử gọi hàm đủ điều kiện. –

+0

Ohhhhhh .... có ý nghĩa hoàn hảo. –

Trả lời

11

Đối với cùng một mục đích như cho các đối số: nên khi Func::operator() là một ref trình độ:

struct Functor 
{ 
    void operator()() const & { std::cout << "lvalue functor\n"; } 
    void operator()() const && { std::cout << "rvalue functor\n"; } 
}; 

Demo

+4

Xóa phần 'const', sau đó nó làm cho * tốt hơn * ý nghĩa. – Nawaz

+0

không, vì tham chiếu 'const' rvalue sẽ thích' const & 'overload to' && 'overload:' const Functor f() {return Functor {}; }; f()(); '[ví dụ] (http://coliru.stacked-crooked.com/a/3e1b8f476f9e3f05) –

Các vấn đề liên quan