так и чему он не равен?
в пропозале C++ написно, что он отложен до C++29.
Мне в целом фиолетово, что написано в стандарте, мой код компилирует компилятор, а не стандарт.
ОК. На этом мои полномочия -- всё.
А ещё у вас UB, когда вызываете placement new на невыровненный массив байтов
Вы можете использовать только так:
То есть размер должен быть известен на момент компиляции.
date с типом структуры Date. Эта глобальная переменная неявным образом инициализируется статической функцией Core::get_system_parameters, которая использует Config::search_str для инициализации полей переменной date.Date. А удобно ли тебе указывать эти же имена полей еще десятки раз там, где ты ими пользуешься? Не смущает ли тебя что эти поля везде модифицируемые, т.к. date не константна? Не беспокоит ли тебя то, что в результате get_system_parameters(); переменная date внезапно становится инициализированной и это вообще никак не описано в имени функции? Слово get в префиксе функции сразу говорит о том, что функция является аксессором, в частности - геттером и возвращает инициализированное значение, но у тебя слева от get_system_parameters(); нет присвоения, тебе это странным не кажется?Date у тебя является агрегатной и для нее доступна агрегатная инициализация.return {
Config::search_str("title"),
Config::search_bool("fullskreen"),
Config::search_bool("window_mode"),
Config::search_int("width"),
Config::search_int("height"),
Config::search_int("render_API")
};const Date& Core::get_system_parameters() {
static const Date date{
Config::search_str("title"),
Config::search_bool("fullskreen"),
Config::search_bool("window_mode"),
Config::search_int("width"),
Config::search_int("height"),
Config::search_int("render_API")
};
return date;
}Core::get_system_parameters(). я не хочу по 2 раза писать одни и те же переменые в структуре объявляя их
// Определение структуры `Date`.
struct Date {
int a; // Определение поля `a` в структуре `Date`.
};
// Определение глобальной переменной `date` типа `Date`.
Date date;
// Определение глобальной процедуры `get_parametrs`.
void get_parametrs(){
// Полю `a` глобальной переменной `date` присваивается значение `5`.
date.a = 5;
}parent[num] = findMN(parent[num]);
return parent[num];А разве в случае prvalue трейты std::remove_reference+std::remove_const не сделают ничего ?
std::decay даже понятнее, т.к. его семантика говорит снять все что есть. А если ничего нет, то и снимать нечего. Тут нужно видеть разницу между "снять все что есть" и "снять именно это".std::decay удобен своей семантикой. Читаешь и сразу понимаешь что происходит с переданным типом.std::decay. Преобразование к указателю - незначительное зло, с которым даже можно успешно жить.std::decay, они всегда идут разными путями. test первым параметром зайдет внезапно prvalue, для которого T выведется в чистый тип. Трансляция даже не остановится, т.к. std::remove_reference и std::remove_const созданы так, чтобы не замечать отсутствия того, что они призваны удалять.static_assert на соответствие типов. И в этом месте яб именно std::decay использовал. Так твой контракт получит механизм соблюдения.requires для явного определения контракта.