Re[9]: this const
От: Артур Россия  
Дата: 10.04.03 14:55
Оценка: 18 (2)
Здравствуйте, Михаил Трухманов, Вы писали:



МТ>Новая формулировка: есть предположение, что 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.

... << RSDN@Home 1.0 beta 6a >>
Re[5]: this const
От: Дмитрий Наумов  
Дата: 10.04.03 11:34
Оценка: +1 -1
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Мне кажется, 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(int const* i);

это одно и тоже, но не тоже самое, что
void foo(int* i);
... << RSDN@Home 1.0 beta 6a >>
Re[10]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 13:50
Оценка: 10 (1)
Здравствуйте, Дмитрий Наумов, Вы писали:

МТ>Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что

МТ>1.кажется бессмысленным указывать const по значению
МТ>2.VC6 генерит одни и те же имена

ДН>const по значению спасет вас, или скорее всего, того кто через некий большой срок будет править\добавлять ваш код от случайного изменения этого значения внутри метода. ИМХО, просто полезная фича — как памперсы...


Вопросы:
Действительно ли эта фича полезна? (параметр const по значению)
Использовали ли Вы ее хоть раз? Видели ли Вы, чтоб хоть кто-то ее использовал?

Если она полезна и ее используют, кажется, было бы последовательно использовать ее везде, где только можно, да? Неужели Вы пишете так: void foo(const int); ?
Re[6]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 12:02
Оценка: 8 (1)
Здравствуйте, 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 по значению не нужен).
Re: this const
От: Сергей Зизев Украина  
Дата: 10.04.03 08:51
Оценка: +1
Здравствуйте, 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
Точнее давай
_> }
<...>
Re[6]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 11:48
Оценка: +1
Здравствуйте, Дмитрий Наумов, Вы писали:

МТ>Мне кажется, 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(int const* i);

ДН>это одно и тоже, но не тоже самое, что
ДН>void foo(int* i);

Согласен. А я разве утверждал обратное?
Суть была в том, что вообще все четыре декларации объявляют одно и то же:
    void foo(const int* i); 
    void foo(const int* const i); 
    void foo(int const* i);
    void foo(int const* const i);
this const
От: server_mouse Беларусь about:blank
Дата: 10.04.03 08:44
Оценка:
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 *'
 }

  int a;
};

void foo(CSockClient *pClient)
{
 pClient->a=0;
}


Собственно почему компилятор решил сделать this константным? И как решить проблему?
Повреждение мозга после ректальной биопсии — редкая штука (с) Хаус
Re: this const
От: Дмитрий Наумов  
Дата: 10.04.03 08:50
Оценка:
Здравствуйте, server_mouse, Вы писали:

SM>Hi ALL. Вопрос очень простой, но я что-то торможу....


SM>
SM>class CSockClient;
SM>extern void foo(CSockClient *pClient);

SM>class CSockClient
SM>{
SM> public:
SM> virtual void class_foo()
SM> {
SM>  foo(this);    
SM>// Сюда ругаемся: cannot convert parameter 1 from 'class CSockServ *const ' to 'const class CSockClient *'
SM> }

SM>  int a;
SM>};

SM>void foo(CSockClient *pClient)
SM>{
SM> pClient->a=0;
SM>}
SM>


SM>Собственно почему компилятор решил сделать this константным? И как решить проблему?


Место откуда CSockCLient::class_foo() вызывается покажи и все ясно будет, потому как там беда
... << RSDN@Home 1.0 beta 6a >>
Re: this const
От: MaximE Великобритания  
Дата: 10.04.03 08:55
Оценка:
Здравствуйте, server_mouse, Вы писали:

SM>Hi ALL. Вопрос очень простой, но я что-то торможу....


SM>
SM>class CSockClient;
SM>extern void foo(CSockClient *pClient);

SM>class CSockClient
SM>{
SM> public:
SM> virtual void class_foo()
SM> {
SM>  foo(this);    
SM>// Сюда ругаемся: cannot convert parameter 1 from 'class CSockServ *const ' to 'const class CSockClient *'
SM> }

SM>  int a;
SM>};

SM>void foo(CSockClient *pClient)
SM>{
SM> pClient->a=0;
SM>}
SM>


SM>Собственно почему компилятор решил сделать this константным? И как решить проблему?


Это не *this константный, а указатель на *this.
void foo(CSockClient *const pClient);
Re[2]: this const
От: MTrukhmanov Россия  
Дата: 10.04.03 09:04
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Это не *this константный, а указатель на *this.

ME>
ME>void foo(CSockClient *const pClient);
ME>

Ой, а что это?
Что-то типа этого?
void foo(const int i);
Re[3]: this const
От: MaximE Великобритания  
Дата: 10.04.03 09:30
Оценка:
Здравствуйте, MTrukhmanov, Вы писали:

MT>Здравствуйте, MaximE, Вы писали:


ME>>Это не *this константный, а указатель на *this.

ME>>
ME>>void foo(CSockClient *const pClient);
ME>>

MT>Ой, а что это?
MT>Что-то типа этого?
MT>
MT>void foo(const int i);
MT>


Нет, это типа

void foo(const int* i);
void foo(int* const i);


суть разные (перегруженная) функции.
Re[4]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 11:10
Оценка:
Здравствуйте, MaximE, Вы писали:
ME>>void foo(CSockClient *const pClient);

MT>Ой, а что это?
MT>Что-то типа этого?
MT>void foo(const int i);

ME>Нет, это типа
ME>void foo(const int* i);
ME>void foo(int* const i);

ME>суть разные (перегруженная) функции.

Мне кажется, 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 здесь ни к чему.
Re[5]: this const
От: Артур Россия  
Дата: 10.04.03 11:27
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:


МТ>Мне кажется, 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 здесь ни к чему.

Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет.
... << RSDN@Home 1.0 beta 6a >>
Re[5]: this const
От: MaximE Великобритания  
Дата: 10.04.03 11:40
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Мне кажется, 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; // нельзя
}
Re[6]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 11:41
Оценка:
Здравствуйте, Артур, Вы писали:

А>Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет.


Любезно
А ты, например, попробуй объявить все три в классе. Может, подтолкнет на размышления
Re[7]: this const
От: Артур Россия  
Дата: 10.04.03 12:03
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Здравствуйте, Артур, Вы писали:


А>>Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет.


МТ>Любезно

МТ>А ты, например, попробуй объявить все три в классе. Может, подтолкнет на размышления

А при чём тут это? очень много чего нельзя объявить в классе.
void fo()
int fo()
например. Это то же не одна и та же функция??

а
void foo(int* i);
void foo(const int* i);

очень даже хорошо уживаются в одном классе.
... << RSDN@Home 1.0 beta 6a >>
Re[7]: this const
От: MaximE Великобритания  
Дата: 10.04.03 12:29
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Мне казалось, что функции реализуют некоторый интерфейс, а с точки зрения интерфейса нет никакого смысла указывать объект, передаваемый по значению, как константный (в Вашем случае --- указатель на int).

МТ>А если зачем-то (?) в реализации функции не надо менять параметр, пришедший по значению, то это не должно отражаться на интерфейсе (т.е. в декларации финкции const по значению не нужен).

Дык никто про интерфейсы не говорил.
Речь была о том, что int* const и const int* — совсем не одно и то же.
Re[8]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 12:39
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Речь была о том, что int* const и const int* — совсем не одно и то же.


Ну да, с этого все и началось. Только я до чего докопался-то: зачем const в параметре (int* const)?
Какой в нем смысл? И привел более простой пример: параметр (int const).
Re[8]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 12:51
Оценка:
Здравствуйте, Артур, Вы писали:

А>>Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет.

МТ>А ты, например, попробуй объявить все три в классе. Может, подтолкнет на размышления
А>А при чём тут это? очень много чего нельзя объявить в классе.
А>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 генерит одни и те же имена
Re[9]: this const
От: Дмитрий Наумов  
Дата: 10.04.03 13:35
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что

МТ>1.кажется бессмысленным указывать const по значению
МТ>2.VC6 генерит одни и те же имена

const по значению спасет вас, или скорее всего, того кто через некий большой срок будет править\добавлять ваш код от случайного изменения этого значения внутри метода. ИМХО, просто полезная фича — как памперсы...
... << RSDN@Home 1.0 beta 6a >>
Re[11]: this const
От: Дмитрий Наумов  
Дата: 10.04.03 14:39
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Вопросы:

МТ>Действительно ли эта фича полезна? (параметр const по значению)
МТ>Использовали ли Вы ее хоть раз? Видели ли Вы, чтоб хоть кто-то ее использовал?

МТ>Если она полезна и ее используют, кажется, было бы последовательно использовать ее везде, где только можно, да? Неужели Вы пишете так: void foo(const int); ?


Вопрос на пять баллов... Ну скажем так, раньше использовал, в больших (на несколько экранов) методах. Но теперь у меня на вооружение поступил рефакторинг и типа никаких огромных методов.
Поэтому скажем так, использовать использую, но иногда...
... << RSDN@Home 1.0 beta 6a >>
Re[10]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 16:05
Оценка:
Здравствуйте, Артур, Вы писали:

МТ>Новая формулировка: есть предположение, что 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". Мы тут рядом с Дмитрием Наумовым на эту тему беседуем
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.