cout یک شی از کلاس ostream هستش
خود کلاس ostram هم typedef از
basic_ostream
extern ostream cout;
typedef basic_ostream<char> ostream;
template <class charT, class traits = char_traits<charT> >
class basic_ostream;
شما وقتی که از > توی c++ استفاده می کنی کامپایلر سعی می کنه بصورت ضمنی تبدیل رو انجام بده
و از اون جایی هم که basic_ios از اپراتور void* استفاده می کنه و "aa" هم قابل تبدیل به void* هست کامپایلر میاد اینا رو به هم تبدیل می کنه بعد مقایسه می کنه..
http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool
در ضمن کد بالا از c++11 به بعد نباید اجرا بشه چون operator bool جایگزین void* شده (البته اگر کامپایلر بصورت کامل پشتیبانی کنه )
یک مثال ساده از چیزایی که بالا گفتم میتونه این کد باشه :
class A
{
public:
operator void*(){return 0;}
};
int main() {
A a;
a<"tt";//ok !
}