Зачем мне нужно добавлять const к аргументу?

У меня есть эта функция:

void
SpookyBoy( bool Troublemaker, const Glib::ustring& name, HorrorPunkBand& band );

если я удалю слово const, я получу эту ошибку:

 no known conversion for argument 2 from ‘const char [5]’ to ‘Glib::ustring&’

Мне просто интересно, что делает компилятор, может кто-нибудь объяснить мне, почему со словом const компилятор может привести ?


даже если я должен признать, что эти два вопроса похожи для того, кто уже знает ответ (в тем более), но уж точно не для того, кто еще не знает ответа (в априори). эм>).


person The Unholy Metal Machine    schedule 27.05.2015    source источник
comment
Ваше объявление функции действительно выглядит так? Судя по сообщению об ошибке, параметр ustring, видимо, объявлен как const Glib::ustring& name, т.е. как ссылка.   -  person AnT    schedule 27.05.2015
comment
@AnT да, ты прав, я забыл & +1 тебе   -  person The Unholy Metal Machine    schedule 27.05.2015
comment
возможный дубликат Почему const для неявного преобразования?   -  person AnT    schedule 27.05.2015


Ответы (1)


Очевидно, вы вызываете свою функцию со строковым литералом в качестве аргумента.

SpookyBoy(..., "1234", ...);

Компилятор может неявно преобразовать строковый литерал (который в данном случае имеет тип const char [5]) в тип Glib::ustring. Но результатом этого неявного преобразования является временный объект. В языке C++ только ссылки const lvalue могут быть привязаны к временным объектам. Неконстантные ссылки не могут быть привязаны к временным объектам.

Без этого const в объявлении функции вам пришлось бы вызывать свою функцию как

Glib::ustring name("1234");
SpookyBoy(..., name, ...);

то есть путем явного введения именованного объекта типа Glib::ustring и передачи его в качестве аргумента.

P.S. См. также Почему const для неявного преобразования?

person AnT    schedule 27.05.2015