Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Август 02, 2011, 16:45



Название: const_cast (случай)
Отправлено: Igors от Август 02, 2011, 16:45
Мелочь конечно, но для меня оказалось неожиданностью
Код
C++ (Qt)
std::string src("abc");
std::string temp(src);  
char * c = const_cast <char *> (temp.c_str());
*c = 'x';
// Utils::UpCase(c);  // в оригинале
 
Увы, после этого обе строки (temp и src) становятся "xbc"  :)
пришлось сделать
Код
C++ (Qt)
std::string temp(src.c_str());  
 


Название: Re: const_cast (случай)
Отправлено: Пантер от Август 02, 2011, 16:49
Странно.
Цитировать
string ( const string& str );
Content is initialized to a copy of the string object str.


Название: Re: const_cast (случай)
Отправлено: Igors от Август 02, 2011, 16:52
Странно.
Цитировать
string ( const string& str );
Content is initialized to a copy of the string object str.
Шерит, собака. (gcc 4.2)


Название: Re: const_cast (случай)
Отправлено: Пантер от Август 02, 2011, 16:53
Пруф дай, а то что-то в http://www.cplusplus.com/ нету.


Название: Re: const_cast (случай)
Отправлено: Igors от Август 02, 2011, 17:16
Пруф дай, а то что-то в http://www.cplusplus.com/ нету.
Там говорится, но так "вскольз" что обратить внимание трудно. Легко проверить так
Код
std::string src("abc");
std::string tmp(src);  
qDebug() << (void *) src.c_str() << (void *) tmp.c_str();
 

Edit: печатаем адреса, а не сами строки


Название: Re: const_cast (случай)
Отправлено: zenden от Август 02, 2011, 19:13
Используете грязные хаки, а потом удивляетесь ))

Каждый вправе реализовывать стандарт по-своему


Название: Re: const_cast (случай)
Отправлено: Igors от Август 02, 2011, 19:16
Используете грязные хаки, а потом удивляетесь ))
Ну привет, разве const_cast грязный хак?  :) Да и как перевести std::string в upper case (при отсутствии дуста)?


Название: Re: const_cast (случай)
Отправлено: LisandreL от Август 02, 2011, 21:46
разве const_cast грязный хак?
Ну разве мы можем не верить Алёне (http://alenacpp.blogspot.com/2005/10/mutable-constcast.html)? ;D
Цитировать
Если mutable вполне законное средство убрать константность, у него есть классические применения, то const_cast - это всегда некий хак.
Ну, а если серьёзно, то вы нарушаете инкапсуляцию объекта, поэтому да, это грязный хак.


Название: Re: const_cast (случай)
Отправлено: Anchorite от Август 03, 2011, 08:27
... Да и как перевести std::string в upper case (при отсутствии дуста)?

Учим матчасть :)

Код:
#include <iostream>
#include <cstdlib>
#include <string>
#include <algorithm>

using namespace std;

int main(int argc, char* argv[])
{
    string str = "abcdefghijklmnopqrstuvwxyz";
    cout << "Lower: " << str << endl;

    transform(str.begin(), str.end(), str.begin(), ::toupper);

    cout << "Upper: " << str << endl;

    return 0;
}



Название: Re: const_cast (случай)
Отправлено: Igors от Август 03, 2011, 11:14
Учим матчасть :)
Код:
    transform(str.begin(), str.end(), str.begin(), ::toupper);
Какой Вы быстрый :) Но в оригинале Utils::UpCase так сделано только для Вындоуз платформы, а на Mac вызывается нативная UppercaseText. Разбираться почему мне не хотелось, думал проскочить по-быстрому - ведь я сделал копию.

Ну, а если серьёзно, то вы нарушаете инкапсуляцию объекта, поэтому да, это грязный хак.
Конечно нарушаю - и понес заслуженное наказание. Но для меня новостью оказалось что некоторые STL контейнеры также могут шерить данные. 


Название: Re: const_cast (случай)
Отправлено: LisandreL от Август 03, 2011, 14:51
Но для меня новостью оказалось что некоторые STL контейнеры также могут шерить данные.
В C++03 std::string - корова (copy-on-write), причём без требования атомарности, так что в многопоточном приложении возможна «гибель человеческих жертв». Из интересующих нас компиляторов - реализовано в gcc, не реализовано в MSVC ( по крайней мере в 2008- ).