Trong cuộc thảo luận, chúng tôi đã có here Tôi đang chơi đùa với các functors đi qua. C++ STL chuyển functors thành các giá trị (xem trong std::for_each
, std::find_if
, std::transform
)Tại sao functor templated được chuyển thành giá trị và không chuyển tiếp tham chiếu
Vì vậy, khai báo của tôi sẽ như thế này.
template<typename F>
void call_me(F f)
{
f();
}
Bây giờ, gọi có thể có thể gọi ftor
's copy constructor (nó sẽ rất có thể được copy elided, vì vậy không phải là trường hợp). Nhưng ftor f{}; call_me(f);
sẽ dẫn đến sao chép. Nếu ftor
có dữ liệu lớn, có thể đó là vấn đề.
Chúng tôi sẽ cải thiện nó bằng cách chuyển nó dưới dạng tham chiếu const (void call_me(const F& f)
) để loại bỏ bản sao không cần thiết. Điều này là miễn là ftor::operator()
là const
. Nếu không, cuộc gọi đến call_me
sẽ dẫn đến lỗi biên dịch (mất const
vòng loại).
Vì vậy, tại sao phải bận tâm với tham chiếu const, chỉ sử dụng tham chiếu (void call_me(F& f)
). Điều này là tốt, nhưng nó sẽ không hoạt động đối với trường hợp đầu tiên là vì việc đưa giá trị r vào (tham chiếu giá trị l) không hợp lệ là không hợp lệ.
Khai báo f
làm tham chiếu chuyển tiếp (void call_me(F&& f)
) dường như hoạt động trong mọi trường hợp. Tôi tin rằng, điều này hoạt động nhờ tham chiếu sụp đổ.
Vì vậy, tại sao functors templated không được chuyển như tham chiếu chuyển tiếp trong các chức năng từ STL?