как printf узнает адрес символьных данных CString?

Учитывая этот фрагмент кода:

struct My {
  operator const char*()const{ return "my"; }
} my;

CStringA s( "aha" );
printf("%s %s", s, my );


// another variadic function to get rid of comments about printf :)
void foo( int i, ... ) {
  va_list vars;
  va_start(vars, i);
  for( const char* p = va_arg(vars,const char*)
     ; p != NULL
     ; p=va_arg(vars,const char*) ) 
  {
    std::cout << p << std::endl;
  }
  va_end(vars);
}
foo( 1, s, my );

Этот фрагмент приводит к «интуитивному» выводу «ага». Но я понятия не имею, как это может работать:

  • если вызов вариативной функции транслируется на нажатие указателей аргументов, printf получит CStringA * , который интерпретируется как const char *
  • , если вызов вариативной функции вызывает оператор (const char *) , почему бы ему этого не сделать для моего собственного класса?

Может кто-нибудь объяснить это ?

РЕДАКТИРОВАТЬ: добавлена ​​фиктивная функция с переменными числами, которая обрабатывает ее аргументы как const char * s. Вот - он даже вылетает, когда достигает моего аргумента ...

7
задан xtofl 4 February 2011 в 14:14
поделиться