Можно ли обойти const в параметре метода?
От: Аноним  
Дата: 19.09.13 04:49
Оценка:
Всем привет!

Есть такая функция:
__declspec(dllexport) bool __stdcall CheckName(char const * stName)
{
    ...
    rertun false;
}

Можно ли как-нибудь подменить stName, чтобы значение изменилось для кода, вызывающего этот метод?
Re: Можно ли обойти const в параметре метода?
От: rg45 СССР  
Дата: 19.09.13 05:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всем привет!


А>Есть такая функция:

А>
А>__declspec(dllexport) bool __stdcall CheckName(char const * stName)
А>{
А>    ...
А>    rertun false;
А>}
А>

А>Можно ли как-нибудь подменить stName, чтобы значение изменилось для кода, вызывающего этот метод?

Именно для ВЫЗЫВАЮЩЕГО? И что это даст?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: Можно ли обойти const в параметре метода?
От: kvasya  
Дата: 19.09.13 05:06
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

#include <iostream>
#include <stdio.h>

bool CheckName(char const * stName)
{
    char * nc_name = const_cast<char*>(stName);
    nc_name[0] = '!';
    std::cout << stName << std::endl;
    return false;
}

int main()
{
    char buffer[1024];
    sprintf(buffer, "write to me");
    CheckName(buffer); // success
    char * v = "try";
    CheckName(v); // failed
    return 0;
}
Re: Можно ли обойти const в параметре метода?
От: Stanislav V. Zudin Россия  
Дата: 19.09.13 05:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть такая функция:

А>
А>__declspec(dllexport) bool __stdcall CheckName(char const * stName)
А>{
А>    ...
А>    rertun false;
А>}
А>

А>Можно ли как-нибудь подменить stName, чтобы значение изменилось для кода, вызывающего этот метод?

Снять константность — дело нехитрое:

char* pfufel = (char*)stName;
char* pfufel2 = const_cast<char*>(stName);


Это если подразумевается указатель на константу, для константного указателя даже это не требуется.

Вопрос в другом — а "вызывающий код" такое переживет?
_____________________
С уважением,
Stanislav V. Zudin
Re: Можно ли обойти const в параметре метода?
От: anomander  
Дата: 19.09.13 06:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всем привет!


А>Есть такая функция:

А>
А>__declspec(dllexport) bool __stdcall CheckName(char const * stName)
А>{
А>    ...
А>    rertun false;
А>}
А>

А>Можно ли как-нибудь подменить stName, чтобы значение изменилось для кода, вызывающего этот метод?

А если с той стороны, ну скажем, std::string::c_str()?
Re[2]: Можно ли обойти const в параметре метода?
От: anomander  
Дата: 19.09.13 06:16
Оценка:
Здравствуйте, anomander, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>А если с той стороны, ну скажем, std::string::c_str()?


Или, интереснее,

const char a[] = "a";
CheckName (a);


И это уже не говоря о том, что название функции даже не намекает на такой сайд-эффект.
Re[2]: Можно ли обойти const в параметре метода?
От: Caracrist https://1pwd.org/
Дата: 19.09.13 06:53
Оценка:
Здравствуйте, kvasya, Вы писали:

K>Здравствуйте, Аноним, Вы писали:


K>
K>    char * v = "try";
K>

1. где ты такое откомпилировал?

2. если передать туда "" где будет перый нолик после твоей магии?
~~~~~
~lol~~
~~~ Single Password Solution
Re[3]: Можно ли обойти const в параметре метода?
От: kvasya  
Дата: 19.09.13 08:47
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>1. где ты такое откомпилировал?

А что смущает?

C>2. если передать туда "" где будет перый нолик после твоей магии?

Это не магия, это демонстрация, что так делать нельзя.
Код упадёт и без "".
Re[4]: Можно ли обойти const в параметре метода?
От: dead0k  
Дата: 19.09.13 09:34
Оценка: -1 :))) :))
Здравствуйте, kvasya, Вы писали:

K>Код упадёт и без "".

C:\Work\test2\Release>test2.exe
!rite to me
try

Вот еще. Будет код падать только из-за того, что кто-то что-то там написал на форуме...
Re[3]: Можно ли обойти const в параметре метода?
От: rg45 СССР  
Дата: 19.09.13 19:46
Оценка:
Здравствуйте, Caracrist, Вы писали:

K>>Здравствуйте, Аноним, Вы писали:


K>>
K>>    char * v = "try";
K>>

C>1. где ты такое откомпилировал?

А что, у тебя это где-то не компилируется? Что за компилятор?

Эта возможность в C++03 была зафиксирована в стандарте языка:

4.2 Array-to-pointer conversion
2 A string literal (2.13.4) that is not a wide string literal can be converted to an rvalue of type “pointer to char”; a wide string literal can be converted to an rvalue of type “pointer to wchar_t”. In either case, the result is a pointer to the first element of the array. This conversion is considered only when there is an explicit appropriate pointer target type, and not when there is a general need to convert from an lvalue to an rvalue. [Note: this conversion is deprecated. See Annex D. ] For the purpose of ranking in overload resolution (13.3.3.1.1), this conversion is considered an array-to-pointer conversion followed by a qualification conversion (4.4). [Example: "abc" is converted to “pointer to const char” as an array-to-pointer conversion, and then to “pointer to char” as a qualification conversion.]

В стандарте C++11 этого пункта уже нет, но компиляторы продолжают поддерживать эту возможность:
http://ideone.com/JIJNIa
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.