Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Область видимости операторов
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. При использовании функции, следует - либо указывать её полное имя, включая пространство имён, - либо имя, с префиксом, назначенным пространству имён (чтобы не набирать каждый раз полное), - либо только имя, если пространство имён подключено через using namespace . Я ожидал, что это правило распространяется и на операторы, однако создаётся впечатление, что их область видимости глобальна. Т.е. если я вызываю оператор как функцию, то независимо от того, указываю ли я пространство имён, или же нет - всё компилируется и выполняется, хотя я ожидаю ошибку компиляции в строке, в которой имя оператора указано без namespace. Далее простой код с комментариями: Код: plaintext 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. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. Результат работы кода: Консольный выводx = 100 Hello from prefix increment! ++x = 101 AB::operator++(x); Hello from prefix increment! x = 102 operator++(x); Hello from prefix increment! x = 103 Вопрос: Почему я не получаю ошибки компиляции при вызове оператора в стиле, подобном вызову функции, если не указываю её namespace? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2013, 13:56 |
|
||
|
Область видимости операторов
|
|||
|---|---|---|---|
|
#18+
Compositum, Есть еще один случай, когда функции можно вызывать без неймспейса - если функция объявлена в одном из неймспейсов передаваемых в нее аргументов. Это правило называется argument dependent lookup Именно с этим случаем вы столкнулись (операторы - тоже функции) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2013, 14:25 |
|
||
|
Область видимости операторов
|
|||
|---|---|---|---|
|
#18+
Собственно, ADL и был введен в язык для операторов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2013, 14:27 |
|
||
|
Область видимости операторов
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Благодарю за ответ! Немного изменил код: создал дополнительный namespace и определения всех операторов переместил в него. Причём, обратите внимание, типы возвращаемых значений и типы аргументов в этих операторах не содержат пространств имён(!!!): Код: plaintext 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. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. Код по прежнему компилируется и выполняется. Т.е. компилятор каким-то образом "знает", в каком пространстве имён ему искать "My_class"... Почему я не получаю ошибок компиляции не смотря на то, что не указываю полные имена типов в возвращаемых значениях и в аргументах операторов? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2013, 14:52 |
|
||
|
Область видимости операторов
|
|||
|---|---|---|---|
|
#18+
ой, извиняюсь - второй код не компилируется. :) Я внёс изменения в копию файла, а откомпилировал оригинал. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2013, 14:56 |
|
||
|
Область видимости операторов
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyCompositum, Есть еще один случай, когда функции можно вызывать без неймспейса - если функция объявлена в одном из неймспейсов передаваемых в нее аргументов. Это правило называется argument dependent lookup Именно с этим случаем вы столкнулись (операторы - тоже функции) Спасибо большое, буду знать! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2013, 14:57 |
|
||
|
Область видимости операторов
|
|||
|---|---|---|---|
|
#18+
Compositum, Не верю. Простите :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2013, 14:58 |
|
||
|
Область видимости операторов
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyCompositum, Не верю. Простите :) Это относилось к "прежнему компилируется" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2013, 14:58 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38290385&tid=2020159]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
164ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 268ms |

| 0 / 0 |
