چند تا دلیل داره
۱ـاگر iterator با ارجاع فرستاده بشه اگر داخل تابع عوض بشه بیرون از تابع هم عوض میشه پیش همیشه نیاز پیدا میشد یک کپی از iterator قبل از ارسال بگیرید .
۲ـ متغیر موقت رو نمیشه بصورت ارجاع به تابع فرستاد ( undefine behavior ) هست یعنی اگر به شکل دوم تعریف میشد کد زیر اشتباه بود چون begin , end متغیر موقت return می کنن .
vector<int> a;
std::sort(a.begin(),a.end());//agar sort be shekl dovom bood in jomle eshtebah bood
۳ـ چون اصولا iterator چیزی بجز یک اشاره گر یا یک struct خیلی سبک نیست کپی کردن با فرستادن با ارجاع از نظر زمان اجرایی تفاوتی نداره .