Re: Не получается преобразование нуль-терминальной UTF8 в std::wstring
Добавлено: 15 дек 2015, 06:31
1. В этом завале абсолютно не очевидно.
2. А такой вообще есть?
3. Что он делает?
2. А такой вообще есть?
3. Что он делает?
форум программистов
https://www.developing.ru/
. В большом проекте с обилием чисел. Костыль - не заплатка, тем более если он ещё и из спичек.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;
Ну ИМХО Unreal это достаточно большой проект при всем том.В большом проекте с обилием чисел. Костыль - не заплатка, тем более если он ещё и из спичек
Тут мы имеем дело с языком С++, то есть с тридцатилетней эволюцией комплексов мистера Бьорна Строуструпа, устаревших трендов, ошибочных концепций, тупиковых идей, несбывшихся надежд, шумихи начала 90-х, моды на ООП, анти-сиплюсплюсной реакции после появления Джавы, неожиданно удачного применения фичей С++ для решения проблем для которых они не предназначались, моды на функциональное программирование, притока программистов из академической среды хорошо знающих теорию групп, теорию категорий, дискретную математику и математическую логику, Лисп, Схему, Хаскелль и Coq итд итп.А зачем вообще нужны константы?Зачем тут вообще ставить const?
Ну я могу конечно поставить при помощи VirtualProtect флаг Read-Only на вершину стека. Только программа при этом получит SEH исключение при первой же попытке изменить какую-то локальную переменную и перестанет работать.Энто кто тебе сказал?Стек вообще RW память, const в нем нельзя реализовать физически.
Квалификатор const можно снять при помощи const_cast или C-style cast. Поскольку на практике объект всегда находится либо в хипе либо в стеке которые, в свою очередь, всегда RW и до недавшего времени даже были RWX, это всегда будет работать.const защищает данное от изменение только при доступе по его имени
Сионист писал(а):const защищает данное от изменение только при доступе по его имени
Господа, вы оба не правы. Квалификатор const не только защищает данные от изменения при доступе по имени. И снимать константность с заведомо константного объекта с помощью const_cast является в корне неправильным подходом.Absurd писал(а):Квалификатор const можно снять при помощи const_cast или C-style cast. Поскольку на практике объект всегда находится либо в хипе либо в стеке которые, в свою очередь, всегда RW и до недавшего времени даже были RWX, это всегда будет работать.
Код: Выделить всё
#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;
}
Ну да, компилятор оптимизирует такие вещи. Но он и не-const переменную может заинлайнить если она не extern, у нее никто не берет адрес и не ставит в левую часть оператора присваивания. Кроме того, константы примитивных типов VC++ линкер помещает в секцию .CONST, а gcc сегмента .CONST не имеет и поэтому помещает разные статические стринги в сегмент .TEXT, который тоже RO. Только это не отменяет того что целочисленные константы определяются через enum, а плавающие - через constexpr. А const это никому не нужное унылое говно.Скомпилируйте этот код и запустите в студии. Программист, который такое написал, ожидает вывод 10 и 5, однако, на самом деле, в качестве результата вы увидите две десятки. Компилятор прооптимизировал оба вызова std::cout и подставил везде вместо самого n его значение
А ничего, что значение русского предложения определяется порядком слов? Не "только защищает", аГоспода, вы оба не правы. Квалификатор const не только защищает данные от изменения при доступе по имени.
.защищает только
А каким боком флаг защиты памяти к контролю доступа на этапе компиляции?Ну я могу конечно поставить при помощи VirtualProtect флаг Read-Only на вершину стека. Только программа при этом получит SEH исключение при первой же попытке изменить какую-то локальную переменную и перестанет работать.
Бред, кобыла отдыхает. Именованные константы были ещё в паскале.Тут мы имеем дело с языком С++, то есть с тридцатилетней эволюцией комплексов мистера Бьорна Строуструпа, устаревших трендов, ошибочных концепций, тупиковых идей, несбывшихся надежд, шумихи начала 90-х, моды на ООП, анти-сиплюсплюсной реакции после появления Джавы, неожиданно удачного применения фичей С++ для решения проблем для которых они не предназначались, моды на функциональное программирование, притока программистов из академической среды хорошо знающих теорию групп, теорию категорий, дискретную математику и математическую логику, Лисп, Схему, Хаскелль и Coq итд итп.
Так он и предназначен для защиты от случайного изменения, это вам не паскаль, где константность даже типизированных данных абсолютна, а значения констант всегда подставляются на этапе компиляции, из-за чего есть даже мода называть константами литералы, причём, литералы называются явными константами, а константы - именованными константами. Но если константность не отменять, то она сохраняется. Логично однако.Короче, const не служит для определения констант. Такие дела. Для чего он служит - это отдельный разговор. Некоторые думают что ни для чего. Я менее резок и считаю что при помощи него можно защищать инварианты класса. Если я возвращаю ссылку на std::string которая является полем моего класса я могу одеть на нее const чтобы этот стринг никто не изменил случайно по причине непонимания интерфейса класса, либо по недосмотру. Но целенаправленно либо из-за рантаймовой ошибки - изменить сможет запросто.
Изначальная реплика звучала так: "Стек вообще RW память, const в нем нельзя реализовать физически."А каким боком флаг защиты памяти к контролю доступа на этапе компиляции?