![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Столкнулся с очень странным поведением компилятора VS2005.
Вместо того чтобы использовать подходящий оператор присваивания, он вызывает оператор приведения к другому типу, и затем вызывает перегруженный оператор присваивания. Почему он так делает, и как этого избегать. Решение всегда явно задавать тип при вызове оператора присваивания не подходит потому что слишком не надежное - кода много и где-нибудь обязательно да забудется. Надо чтобы компилятор сам выбирал нужный оператор.
Казалось бы, будет вызван оператор CSock& operator = (CSock& p_sockFrom); и всё будет работать как надо, но почему-то в этой строке возвращенный объект сначала преобразуется к типу SOCKET при помощи operator SOCKET (); и затем для присвоения вызывается CSock& operator = (SOCKET p_sockFrom);. В итоге логика учета референсов не работает. Как научить его ходить в лоток? |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Не решение, а так... костылёк...
А что если в описании класса поднять "правильный" оператор присваивания вверх, перед "неправильными"? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Лучше убрать нафик оператор приведения. Это вообще штука опасная, чревата всякими непредсказуемыми поведениями, особенно для активно развивающегося кода.
Лучше замени его явной функцией. И, скорее всего, это константная функция должна быть. Кроме того, хороший тон требует, чтобы оператор присваивания получал константные ссылку, а не копию и уж тем более не просто ссылку. -------------------- ... |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
судя по всему, не только хороший тон, но и студия ![]() CSock& operator = ( const CSock& p_sockFrom); стал вызываться этот конструктор -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
nerdy_weirdie, функция FindSocket() возвращает так называемое rvalue, т.е. временный объект. По стандарту С++, нельзя такие объекты передавать в качестве параметров функциям, принимающим объекты по неконстантной ссылке. Так как у тебя есть оператор преобразования (что вообще считается дурным тоном, так как может вызывать подобные проблемы) и оператор присваивания принимающий SOCKET, то компилятор их и использует.
По хорошему, достаточно сделать конструктор от (const SOCKET&), чтобы при присваивании объекта типа SOCKET вызвался он, а затем operator=(const CSock&) для полученного объекта:
|
|||
|
||||
nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Спасибо, с константной ссылкой работает. Но всё равно такое поведение мне кажется неадекватным.
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
я правильно понял, что поведение компилятора по стандарту кажется неадекватным ![]() ![]() Бедная M$. Делает не по стандарту (кстати, довольно часто) - ругают. Делают по стандарту - получите, распишитесь ![]() оффтопиковый ![]() а что ты хотел от класса СНосок ? ![]() Это сообщение отредактировал(а) borisbn - 29.3.2011, 17:54 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
По-моему, у ТС сомнения в адыкватности стандарта. То есть в адыкватности языка. Сомнения правильные. ![]() -------------------- |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
поехали. Апперкот - компилятор Си++ есть на все известные платформы (кроме разве что андроида) 1 : 0 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Казалось бы, и причём тут адыкватность? ![]() -------------------- |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |