Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
throw class
|
|||
|---|---|---|---|
|
#18+
Следующий код: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. MSVC 10 нормально компилирует, GCC 4.5.1 - отказывается, заявляя Код: sql 1. 2. 3. 4. 5. К чему бы это?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 01:01 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
В вашем случае GCC видимо не использует оптимизацию и при вызове throw b(3); пытается лишний раз скопировать это значение. Ну а так как конструктора копирования у b нет то и выдает ошибку. В чем проблема сделать так? Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 01:52 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Если копнуть глубже, то проблема спровоцирована тем, что наличие юзерского конструктора базового класса a(a& o) не дает компилятору автоматически сгенерировать конструктор копирования a(const a& o) и как следствие также невозможно сгенерировать конструктор копирования наследника b(const b& o). Поэтому копирование временного объекта b(3) невозможно (почему компилятор вообще захотел его копировать - отдельный вопрос). Правильным решением думаю будет объявить явный конструктор копирования a(const a& o). Тогда b(const b& o) будет сгенерирован автоматически, и можно будет использовать форму throw b(3) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 03:00 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
не использует оптимизациюВ чем проблема сделать так? Хм, так действительно работает, хоть и копирует объект лишний раз. Anatoly MoskovskyПоэтому копирование временного объекта b(3) невозможно А почему компилятор отказывается использовать для копирования конструктор a(a& o)? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 11:48 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА почему компилятор отказывается использовать для копирования конструктор a(a& o)? На временные или константные объекты нельзя ссылаться через неконстантные ссылки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 13:28 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyDimitry SibiryakovА почему компилятор отказывается использовать для копирования конструктор a(a& o)? На временные или константные объекты нельзя ссылаться через неконстантные ссылки. Да. Это MSVC отходит от стандарта и позволяет делать не константные ссылки на временные объекты поэтому первый пример и проходит на нём. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 13:59 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyНа временные или константные объекты нельзя ссылаться через неконстантные ссылки. Фишка, однако, ещё и в том, что когда я объявляю copy constructor с const, то всё компилируется и работает, но этот конструктор не вызывается. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 14:10 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovФишка, однако, ещё и в том, что когда я объявляю copy constructor с const, то всё компилируется и работает, но этот конструктор не вызывается. Это можно объяснить тем, что по стандарту программа дожна быть написана так, как будто никакой оптимизации нет. Но компилятор имеет право для оптимизации убирать копирование через промежуточные объекты. Т.е. компилятор не мог откомпилировать потому что не было конструктора копирования, но как только конструктор добавили - компилятор смог соптимизировать лишнее копирование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 14:17 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyТ.е. компилятор не мог откомпилировать потому что не было конструктора копирования, но как только конструктор добавили - компилятор смог соптимизировать лишнее копирование. Странные люди сидят в комитетах по стандартам... Ещё вопрос: в таком случае насколько безопасно в конструкторе снимать константность при помощи const_cast чтобы изменить что-то в исходном объекте? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 14:21 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovСтранные люди сидят в комитетах по стандартам... А на мой взгляд это очень логичное и удобное правило. Dimitry SibiryakovЕщё вопрос: в таком случае насколько безопасно в конструкторе снимать константность при помощи const_cast чтобы изменить что-то в исходном объекте? Проблема заключается в том что в такой конструктор могут попасть не только временные объекты, но и по настоящему константные (чей владелец не предполагает что они кем-то могут быть изменены). Так что если вы можете гарантировать отсутствие константных объектов - то вполне безопасно. Иначе - нет. Если у вас С++11, то полностью безопасное решения этого вопроса (семантика перемещения) реализуется через rvalue-ссылки (&&). Для компиляторов до С++11 в Бусте есть библиотека Boost.Move которая помогает реализовать семантику перемещения. Но я ее никогда не использовал и не могу сказать что она умеет и как это выглядит в коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 14:30 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyА на мой взгляд это очень логичное и удобное правило. По поводу константных объектов - согласн, но приравнивать к ним временные... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 15:03 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovПо поводу константных объектов - согласн, но приравнивать к ним временные... Их никто не приравнивает. Вы шо-то неправильно поняли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 16:29 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Эммм... Извиняюсь, конечно... А деструктор разве не надо объявить виртуальным в этом случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 17:07 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
NekZЭммм... Извиняюсь, конечно... А деструктор разве не надо объявить виртуальным в этом случае? В этом случае - не обязательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 17:31 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
NekZЭммм... Извиняюсь, конечно... А деструктор разве не надо объявить виртуальным в этом случае? Зачем? Полиморфизм тут не используется, никто не создает динамически объект класса b, не хранит указатель типа класса a и не удаляет через него. Хотя он тут и не помешает, но и не поможет ничем. А советы - в общем случае всегда делать деструктор виртуальным - тоже от балды, особенно когда хранятся массивы из миллионов объектов подобных классов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 17:37 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyИх никто не приравнивает. Вы шо-то неправильно поняли. Возможно. Но что именно: Anatoly MoskovskyНа временные или константные объекты нельзя ссылаться через неконстантные ссылки. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 17:57 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, А в переменную типа int нельзя записать строку или список. По вашей логике получается что строки приравнены к спискам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 18:03 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyПо вашей логике получается что строки приравнены к спискам. А по вашей логике получается, что тип у временного объекта отличается от "обычного" так же как целое от строки. Ну да против объективной реальности всяко не попрёшь... Раз GCC говорит, что отличается, значит отличается. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 18:09 |
|
||
|
throw class
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА по вашей логике получается Не надо про мою логику. Давайте про С++. Временные и константные объекты в С++ не приравнены. Из того утвеждения, из которого вы сделали вывод, что они приравнены, это не следует. Что тут не понятно-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 20:12 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38273142&tid=2020188]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 153ms |

| 0 / 0 |
