دلیل کامپایل شدن با وجود const بودن operator() این هست که operator << مقدار داخل os را تغییر نمیده و فقط چیزی که os بهش اشاره می کنه رو عوض می کنه .
برای روشن تر شدن موضوع این مثال رو در نظر بگیرید :
#include <iostream>
class A
{
public:
A() :a(new int(5)){}
void foo() const
{
//khat zir error mide chon mikhahim meghdar a ro avz konim
//va chon function const hast in emkan vojood nadare
// a =new int(7);
std::cout << *a<<'\n';//5 chap mishe
*a = 7;//ba vojood const boodan error dade nemishe
std::cout << *a;//7 chap mish
}
private:
int *a;
};
int main()
{
const A a;
a.foo();
}
در مثال بالا a=new int(7 چون تابع const هست و می خواهیم مقدار a رو عوض کنیم ارور میده ولی 7=a* ارور نمیده چون مقداری که پوینتر به اون اشاره می کنه فقط عوض میشه و کاری به آدرسی که در a ذخیره شده نداریم .
داخل >> هم همین اتفاق میفته شاید به نظر برسه >> در حال نوشتن داخل کلاس هست و چون تابع const هست باید ارور بده ولی این اتفاق نمیفته چون >> فقط مقداری که پوینتر درون ostream هست رو عوض می کنه و کاری به خود متغیر های عضو کلاس در ostream نداره .