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
для явного определения контракта. int value = 12;
должно иметь характеристику времени компиляции. В ином случае контекстом вызова scale
в выражении scale(value)
будет контекст времени исполнения, а не контекст времени компиляции. И кто решил что это именно сбой?