Я работаю со следующим устаревшим шаблоном кода для отладочных выходов.Я понимаю, что это не самый эффективный способ печати отладочных сообщений, но мой вопрос касается чего-то более фундаментального.Это кажется основным вопросом, но это поставило под сомнение мое понимание того, как параметры функции, указанные как проходные по постоянной ссылке, интерпретируются компилятором.
Шаблон для сообщений отладки в унаследованном коде представлен ниже:
#include <iostream>
#include <cctype>
#include <cstring>
#include <stdio.h>
void debugMsg(const std::string& testStringRef){
printf("%s\n", testStringRef.c_str());
}
int main() {
#if defined(DEBUG_MSG_OUT)
char debug_message[512];
snprintf(debug_message,512, "TESTING 12345678910!");
debugMsg(debug_message);
#endif
return 0;
}
Теперь, прежде чем этот пример привлек мое внимание сегодня, я бы сказал, что он не должен компилироваться, поскольку debugMsg принимает проходпо константной строковой ссылке и вызывается с помощью char [].Но он компилирует и выводит ожидаемую строку при запуске.
Это поставило под сомнение мое понимание параметров передачи по ссылочной функции (я понимаю, что это базовые знания C ++, но для меня это было новым).Я думал, что одно из главных преимуществ параметров справочной функции заключается в том, чтобы избежать создания копирования, которое происходит при передаче по значению.Я бы подумал, что неявные преобразования аргументов при передаче по ссылочным параметрам не будут разрешены, и вместо этого будет ошибка компиляции.Но мне кажется, что временный строковый объект все еще создается, хотя debugMsg является функцией передачи по ссылке.
Я смотрел на разборку этого кода и не вижу вызова конструктора копирования std :: string.Может кто-нибудь прояснить, что здесь происходит с деталями низкого уровня?Если на самом деле char [] неявно преобразуется в std :: string, а затем этот объект передается в debugMsg (), почему это допускается в C ++ для конкретного прохода ссылочными функциями?
![Disassembly debugMsg](https://i.stack.imgur.com/O9EVp.png)