C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Temprory used for parameter '...' in call '...', Как избавиться от предупреждения
Schumi
Отправлено: 11.05.2005, 20:17


Машинист паровоза

Группа: Участник
Сообщений: 206



У меня есть функция, которая принимает в качестве параметра — ссылку на AnsiString. После этого при любом использовании данной функции выдается предупреждение  — жить можно, но просто мне не нравятся когда есть хоть одно предупреждение biggrin.gif . В чем причина?

P.S: если просто AnsiString — все хорошо.
Георгий
Отправлено: 11.05.2005, 22:58


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



CODE
похоже ты написал
void func( AnsiString& str ){};
а если напишешь
void func( const AnsiString& ){};
то предупреждения при следующем вызове не будет
func( "asd" );

дело в том, что значение передаваемое в функцию преобразуется к типу входного агрумента, в данном случае AnsiString, и при передаче аргумента другого типа (например char*) в функцию будет передан временный объект сконструированный из char* (конструктор AnsiString(const char*)). но значение, передаваемое по ссылке, возможно изменить внутри функции. т.е. в этом случае изменен будет временный объект, созданный компилятором.
Спрашивается зачем функции изменять временный объект созданный компилятором? Вот компилятор ввиде такого предупреждения и задаёт тебе вопрос.

короче — передаёшь что-нибудь по ссылке, передавай ссылку на константный объект.
Schumi
Отправлено: 12.05.2005, 07:37


Машинист паровоза

Группа: Участник
Сообщений: 206



Спасибо за подробный ответ
Sl@Sh
Отправлено: 12.05.2005, 16:24


Мастер участка

Группа: Участник
Сообщений: 383



QUOTE
короче — передаёшь что-нибудь по ссылке, передавай ссылку на константный объект


А если предполагается изменить значение ? Да и потом компилятор не во всех случаях выдаёт такое сообщение.

Может вы просто не меняете значение ? Тогда const это то что нужно.
Schumi
Отправлено: 12.05.2005, 19:52


Машинист паровоза

Группа: Участник
Сообщений: 206



Может я не прав: но меня всегда учили, что везде, где только можно нужно стараться передавать указатели. Понятно, что ради int,char,float — смысла нет (4 байта) — но когда целый класс передается, как параметр, то нужно ссылкой. Может я не прав.
Sl@Sh
Отправлено: 12.05.2005, 20:59


Мастер участка

Группа: Участник
Сообщений: 383



Экономить желательно на всём. Даже 4 байта. Указатели поидее те же ссылки (тут я могу быть не прав).
Schumi
Отправлено: 13.05.2005, 08:16


Машинист паровоза

Группа: Участник
Сообщений: 206



QUOTE (Sl@Sh @ 12/05/2005, 20:59)
Указатели поидее те же ссылки (тут я могу быть не прав).

Ты знаешь не совсем.
Sl@Sh
Отправлено: 13.05.2005, 16:28


Мастер участка

Группа: Участник
Сообщений: 383



Да я немного напутал. Ссылка — псевдоним, а указатель указывает на объект определённого типа.

Вернуться в Вопросы программирования в C++Builder