МТ>Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что МТ>1.кажется бессмысленным указывать const по значению МТ>2.VC6 генерит одни и те же имена
Пожалуй ты прав:
ansi_iso_iec_14882-1998 8.3.5 Functions пункт 3:
The type of a function is determined using the following rules. The type of each parameter is determined from its own declspecifierseq and declarator. After determining the type of each parameter, any parameter of type “array of T” or “function returning T” is adjusted to be “pointer to T” or “pointer to function returning T,” respectively. After producing the list of parameter types, several transformations take place upon these types to determine the function type. Any cvqualifier modifying a parameter type is deleted . [Example: the type void(*)(const int) becomes void(*)(int) —end example] Such cvqualifiers affect only the definition of the parameter within the body of the function; they do not affect the function type.
Здравствуйте, Михаил Трухманов, Вы писали:
МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же. МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
Здравствуйте, Дмитрий Наумов, Вы писали:
МТ>Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что МТ>1.кажется бессмысленным указывать const по значению МТ>2.VC6 генерит одни и те же имена
ДН>const по значению спасет вас, или скорее всего, того кто через некий большой срок будет править\добавлять ваш код от случайного изменения этого значения внутри метода. ИМХО, просто полезная фича — как памперсы...
Вопросы:
Действительно ли эта фича полезна? (параметр const по значению)
Использовали ли Вы ее хоть раз? Видели ли Вы, чтоб хоть кто-то ее использовал?
Если она полезна и ее используют, кажется, было бы последовательно использовать ее везде, где только можно, да? Неужели Вы пишете так: void foo(const int); ?
Здравствуйте, MaximE, Вы писали:
МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же. МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
ME>void foo(const int* i) // i - неконстантный указатель на константный int
ME>{
ME> *i = 0; // нельзя
ME> ++i; // можно
ME>}
ME>void foo(int* const i) // i - константный указатель на неконстантный int
ME>{
ME> *i = 0; // можно
ME> ++i; // нельзя
ME>}
Мне казалось, что функции реализуют некоторый интерфейс, а с точки зрения интерфейса нет никакого смысла указывать объект, передаваемый по значению, как константный (в Вашем случае --- указатель на int).
А если зачем-то (?) в реализации функции не надо менять параметр, пришедший по значению, то это не должно отражаться на интерфейсе (т.е. в декларации финкции const по значению не нужен).
Здравствуйте, server_mouse, Вы писали:
_>Hi ALL. Вопрос очень простой, но я что-то торможу....
_>
_>class CSockClient;
_>extern void foo(CSockClient *pClient);
_>class CSockClient
_>{
_> public:
_> virtual void class_foo()
_> {
_> foo(this);
_>// Сюда ругаемся: cannot convert parameter 1 from 'class CSockServ *const ' to 'const class CSockClient *'
Приведенный пример не может соответствовать данной ошибке. т.к. нет класса CSockServ
Точнее давай
_> }
<...>
Здравствуйте, Дмитрий Наумов, Вы писали:
МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же. МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же.
А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же. МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет.
Здравствуйте, Михаил Трухманов, Вы писали:
МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же. МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
void foo(const int* i) // i - неконстантный указатель на константный int
{
*i = 0; // нельзя
++i; // можно
}
void foo(int* const i) // i - константный указатель на неконстантный int
{
*i = 0; // можно
++i; // нельзя
}
Здравствуйте, Михаил Трухманов, Вы писали:
МТ>Здравствуйте, Артур, Вы писали:
А>>Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет.
МТ>Любезно МТ>А ты, например, попробуй объявить все три в классе. Может, подтолкнет на размышления
А при чём тут это? очень много чего нельзя объявить в классе.
void fo()
int fo()
например. Это то же не одна и та же функция??
Здравствуйте, Михаил Трухманов, Вы писали:
МТ>Мне казалось, что функции реализуют некоторый интерфейс, а с точки зрения интерфейса нет никакого смысла указывать объект, передаваемый по значению, как константный (в Вашем случае --- указатель на int). МТ>А если зачем-то (?) в реализации функции не надо менять параметр, пришедший по значению, то это не должно отражаться на интерфейсе (т.е. в декларации финкции const по значению не нужен).
Дык никто про интерфейсы не говорил.
Речь была о том, что int* const и const int* — совсем не одно и то же.
Здравствуйте, MaximE, Вы писали:
ME>Речь была о том, что int* const и const int* — совсем не одно и то же.
Ну да, с этого все и началось. Только я до чего докопался-то: зачем const в параметре (int* const)?
Какой в нем смысл? И привел более простой пример: параметр (int const).
Здравствуйте, Артур, Вы писали:
А>>Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет. МТ>А ты, например, попробуй объявить все три в классе. Может, подтолкнет на размышления А>А при чём тут это? очень много чего нельзя объявить в классе. А>void fo() А>int fo() А>например. Это то же не одна и та же функция??
А>а А>void foo(int* i); А>void foo(const int* i); А>очень даже хорошо уживаются в одном классе.
1.ОК. Про "одно и то же" я, похоже, неправильно сказал
2.Я говорю не про foo(int*) и foo(const int*), а про foo(int*) и foo(int* const)
Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что
1.кажется бессмысленным указывать const по значению
2.VC6 генерит одни и те же имена
Здравствуйте, Михаил Трухманов, Вы писали:
МТ>Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что МТ>1.кажется бессмысленным указывать const по значению МТ>2.VC6 генерит одни и те же имена
const по значению спасет вас, или скорее всего, того кто через некий большой срок будет править\добавлять ваш код от случайного изменения этого значения внутри метода. ИМХО, просто полезная фича — как памперсы...
Здравствуйте, Михаил Трухманов, Вы писали:
МТ>Вопросы: МТ>Действительно ли эта фича полезна? (параметр const по значению) МТ>Использовали ли Вы ее хоть раз? Видели ли Вы, чтоб хоть кто-то ее использовал?
МТ>Если она полезна и ее используют, кажется, было бы последовательно использовать ее везде, где только можно, да? Неужели Вы пишете так: void foo(const int); ?
Вопрос на пять баллов... Ну скажем так, раньше использовал, в больших (на несколько экранов) методах. Но теперь у меня на вооружение поступил рефакторинг и типа никаких огромных методов.
Поэтому скажем так, использовать использую, но иногда...
Здравствуйте, Артур, Вы писали:
МТ>Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что МТ>1.кажется бессмысленным указывать const по значению МТ>2.VC6 генерит одни и те же имена
А>Пожалуй ты прав:
Any cvqualifier modifying a parameter type is deleted . [Example: the type void(*)(const int) becomes void(*)(int) —end example] Such cvqualifiers affect only the definition of the parameter within the body of the function; they do not affect the function type.
Жалко, у меня нет навыка искать в стандарте
Но, в принципе, это не совсем "одно и то же" отличие есть -- для "the body of the function". Мы тут рядом с Дмитрием Наумовым на эту тему беседуем