#c #functor
Вопрос:
struct test
{
bool operator()(const test amp;lhs, const test amp;rhs)
{
if(flag)
{
// do stuff
}
}
bool flag;
};
std::priority_queue<test, std::vector<test>, test> pq;
В этом классе функторов здесь (созданном для того, чтобы быть пользовательским компаратором для предыдущего, он использует переменную флага, но мне неясно, какую переменную флага объекта он использует. Является ли поведение здесь неопределенным?
Комментарии:
1. Есть ли у класса конструктор, который инициализирует флаг? Если это так, то оно четко определено.
2. Если это все, то нет,
flag
будет неинициализирован.3.
priority_queue
Будет создан собственный экземпляр указанного компаратора, созданный по умолчанию, если вы не передадите экземпляр конструкторуpriority_queue
. Но вашаtest
структура ничего не делает для инициализации своего собственногоflag
элемента, поэтому поведение будет неопределенным, посколькуflag
значение не определено.4.
std::priority_queue
имеет переменную — член типа компаратора. Это тот объект, который используетсяstd::priority_queue
объектом.5. @roulette01 Очередь приоритетов генерирует один
test
объект при построении для использования в качестве компаратора. На самом деле не имеет смысла использовать один и тот же класс как для типа значения, так и для сравнения, как вы делаете здесь.
Ответ №1:
Да, это не определено. Эта строка кода:
std::priority_queue<test, std::vector<test>, test> pq;
Эквивалентно
std::priority_queue<test, std::vector<test>, test> pq{test()};
Вместо этого вы можете передать свой собственный экземпляр test
:
std::priority_queue<test, std::vector<test>, test> pq{test{false}};
Ответ №2:
flag
в вашем случае не определено. Более того, объявление bool flag
в структуре не имеет никакого эффекта, поскольку оно выходит за рамки.
Комментарии:
1. Как это выходит за рамки?
2. Область действия вашей функции отличается от области действия вашей структуры. Как только область действия вашей функции заканчивается, все, что инициализировано даже в структуре, не имеет никакого значения для вашей функции.