Не получается преобразование нуль-терминальной UTF8 в std::wstring
Модераторы: Duncon, Hawk, Romeo, Eugie
1. В этом завале абсолютно не очевидно.
2. А такой вообще есть?
3. Что он делает?
2. А такой вообще есть?
3. Что он делает?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Да что ж ты, как ребёнок малый? Неужели обязательно нужно тыкать и объяснять всё? Открой гугл и узнай, что делает конструктор.
Я понимаю, когда школьники или студентики начальных курсов не могут ни в чём разобраться сами. Они не привыкли ещё самостоятельно работать. Но ты же дядька уже...
Я понимаю, когда школьники или студентики начальных курсов не могут ни в чём разобраться сами. Они не привыкли ещё самостоятельно работать. Но ты же дядька уже...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
. В большом проекте с обилием чисел. Костыль - не заплатка, тем более если он ещё и из спичек.Absurd писал(а):Поэтому макросам дают такие имена чтобы не напарываться
А зачем вообще нужны константы?Absurd писал(а):Зачем тут вообще ставить const?Код: Выделить всё
void f1() { const float x=20.3; } void f2() { const float x=30.64; }
Энто кто тебе сказал?Absurd писал(а):Стек вообще RW память, const в нем нельзя реализовать физически.
Потому что константа неявно приведена к переменной путём выхода за границу массива. Можно и чуть явнейAbsurd писал(а):У меня выводит 666Код: Выделить всё
struct Q { float nefarious[1]; const float x = 20.3; }; int main() { Q q; // q.x = 666.0f; Не компилируется q.nefarious[1] = 666.0f; std::cout << q.x; return 0; }
Код: Выделить всё
uniont Q {
float nefarious[1];
const float x = 20.3;
};
int main()
{
Q.nefarious[0]=666;
std::cout<<Q.x;
return 0;
}
Код: Выделить всё
int x=6;
const int *p=&x;
x=23;
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Ну ИМХО Unreal это достаточно большой проект при всем том.В большом проекте с обилием чисел. Костыль - не заплатка, тем более если он ещё и из спичек
Тут мы имеем дело с языком С++, то есть с тридцатилетней эволюцией комплексов мистера Бьорна Строуструпа, устаревших трендов, ошибочных концепций, тупиковых идей, несбывшихся надежд, шумихи начала 90-х, моды на ООП, анти-сиплюсплюсной реакции после появления Джавы, неожиданно удачного применения фичей С++ для решения проблем для которых они не предназначались, моды на функциональное программирование, притока программистов из академической среды хорошо знающих теорию групп, теорию категорий, дискретную математику и математическую логику, Лисп, Схему, Хаскелль и Coq итд итп.А зачем вообще нужны константы?Зачем тут вообще ставить const?
Короче, const не служит для определения констант. Такие дела. Для чего он служит - это отдельный разговор. Некоторые думают что ни для чего. Я менее резок и считаю что при помощи него можно защищать инварианты класса. Если я возвращаю ссылку на std::string которая является полем моего класса я могу одеть на нее const чтобы этот стринг никто не изменил случайно по причине непонимания интерфейса класса, либо по недосмотру. Но целенаправленно либо из-за рантаймовой ошибки - изменить сможет запросто.
Ну я могу конечно поставить при помощи VirtualProtect флаг Read-Only на вершину стека. Только программа при этом получит SEH исключение при первой же попытке изменить какую-то локальную переменную и перестанет работать.Энто кто тебе сказал?Стек вообще RW память, const в нем нельзя реализовать физически.
Квалификатор const можно снять при помощи const_cast или C-style cast. Поскольку на практике объект всегда находится либо в хипе либо в стеке которые, в свою очередь, всегда RW и до недавшего времени даже были RWX, это всегда будет работать.const защищает данное от изменение только при доступе по его имени
2B OR NOT(2B) = FF
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Этот "завал" был предложен на stackoverflow и был немедленно принят в качестве ответа. Но у Remy Lebeau нашлось куча нареканий к качеству кода и мне пришлось их фиксить несколько раз. Тебе я дал окончательный, вылизанный, вариант.
2B OR NOT(2B) = FF
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Сионист писал(а):const защищает данное от изменение только при доступе по его имени
Господа, вы оба не правы. Квалификатор const не только защищает данные от изменения при доступе по имени. И снимать константность с заведомо константного объекта с помощью const_cast является в корне неправильным подходом.Absurd писал(а):Квалификатор const можно снять при помощи const_cast или C-style cast. Поскольку на практике объект всегда находится либо в хипе либо в стеке которые, в свою очередь, всегда RW и до недавшего времени даже были RWX, это всегда будет работать.
Дело в том, что объявляя данные const мы не только запрещаем их изменение, но так же сообщаем компилятору, что эти данные не будут меняться во время выполнения программы/участка кода, таким образом разрешая ему производить оптимизацию. Именно поэтому в стандарте написано, что снятие константности с заведомо константных данных и их последующая модификация ведёт к undefined behavior.
Код: Выделить всё
#include <iostream>
const int n = 10]
Скомпилируйте этот код и запустите в студии. Программист, который такое написал, ожидает вывод 10 и 5, однако, на самом деле, в качестве результата вы увидите две десятки. Компилятор прооптимизировал оба вызова std::cout и подставил везде вместо самого n его значение. А то, что n поменяли - это уже проблема глупого программиста, который не прочёл стандарт.
Если же скомпилировать и запустить это на MinGW, то вообще получите краш приложения.
Одним словом - undefined behavior.
А вот этот код будет работать адекватно на любом компиляторе:
[code=cpp]
#include <iostream>
int n = 10;
void change_param(const int& param, int value)
{
const_cast<int&>(param) = value;
}
int main()
{
std::cout << n << std::endl;
change_param(n, 5);
std::cout << n << std::endl;
return 0;
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Ну да, компилятор оптимизирует такие вещи. Но он и не-const переменную может заинлайнить если она не extern, у нее никто не берет адрес и не ставит в левую часть оператора присваивания. Кроме того, константы примитивных типов VC++ линкер помещает в секцию .CONST, а gcc сегмента .CONST не имеет и поэтому помещает разные статические стринги в сегмент .TEXT, который тоже RO. Только это не отменяет того что целочисленные константы определяются через enum, а плавающие - через constexpr. А const это никому не нужное унылое говно.Скомпилируйте этот код и запустите в студии. Программист, который такое написал, ожидает вывод 10 и 5, однако, на самом деле, в качестве результата вы увидите две десятки. Компилятор прооптимизировал оба вызова std::cout и подставил везде вместо самого n его значение
2B OR NOT(2B) = FF
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Ну пока не было constrexpr, это была не унылое говно, а единственное правильное решение для плавающих
Собственно, о последнем я и не спорю. Я просто сагрился на снятие константности через const_cast или С-style cast 


Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
А ничего, что значение русского предложения определяется порядком слов? Не "только защищает", аГоспода, вы оба не правы. Квалификатор const не только защищает данные от изменения при доступе по имени.
.защищает только
А каким боком флаг защиты памяти к контролю доступа на этапе компиляции?Ну я могу конечно поставить при помощи VirtualProtect флаг Read-Only на вершину стека. Только программа при этом получит SEH исключение при первой же попытке изменить какую-то локальную переменную и перестанет работать.
Бред, кобыла отдыхает. Именованные константы были ещё в паскале.Тут мы имеем дело с языком С++, то есть с тридцатилетней эволюцией комплексов мистера Бьорна Строуструпа, устаревших трендов, ошибочных концепций, тупиковых идей, несбывшихся надежд, шумихи начала 90-х, моды на ООП, анти-сиплюсплюсной реакции после появления Джавы, неожиданно удачного применения фичей С++ для решения проблем для которых они не предназначались, моды на функциональное программирование, притока программистов из академической среды хорошо знающих теорию групп, теорию категорий, дискретную математику и математическую логику, Лисп, Схему, Хаскелль и Coq итд итп.
Так он и предназначен для защиты от случайного изменения, это вам не паскаль, где константность даже типизированных данных абсолютна, а значения констант всегда подставляются на этапе компиляции, из-за чего есть даже мода называть константами литералы, причём, литералы называются явными константами, а константы - именованными константами. Но если константность не отменять, то она сохраняется. Логично однако.Короче, const не служит для определения констант. Такие дела. Для чего он служит - это отдельный разговор. Некоторые думают что ни для чего. Я менее резок и считаю что при помощи него можно защищать инварианты класса. Если я возвращаю ссылку на std::string которая является полем моего класса я могу одеть на нее const чтобы этот стринг никто не изменил случайно по причине непонимания интерфейса класса, либо по недосмотру. Но целенаправленно либо из-за рантаймовой ошибки - изменить сможет запросто.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Изначальная реплика звучала так: "Стек вообще RW память, const в нем нельзя реализовать физически."А каким боком флаг защиты памяти к контролю доступа на этапе компиляции?
Обычно когда программисты говорят "физически" они имеют в виду в виду уровень железа, т.е. аппаратную поддержку. Аппаратно памать распределяется страницами по 4К и флаг можно поставить только на целую страницу целиком.
2B OR NOT(2B) = FF