Я использую maven для моего проекта, и когда я делаю mvn clean install
и пытаюсь запустить программу, он выдает исключение. Итак, я очищаю проект и запускаю его снова, и он работает для меня.
Я использую eclipse IDE.
Для:
Класс не найден Исключение при запуске теста Junit
blockquote>Попробуйте запустить
mvn clean test
, как только он скомпилирует все тестовые классы (работал для меня).
Как уже было описано в других ответах, лямбды представляют собой, по существу, синтаксический сахар для легкого создания типов, которые обеспечивают пользовательскую реализацию operator()
. Вот почему вы можете даже писать лямбда-вызовы, используя явную ссылку на operator()
, например: int main() { return [](){ return 0; }.operator()(); }
. Те же правила для всех нестатических функций-членов также применяются к лямбда-телам.
И эти правила позволяют уничтожать объект во время выполнения функции-члена, если функция-член не использует this
после. Ваш пример необычный, более распространенным примером является нестатическая функция-член, выполняющая delete this;
. Это сделало его в FAQ на C ++ , объяснив, что это разрешено.
Стандарт позволяет это, не обращаясь к нему, насколько мне известно. Он описывает семантику функций-членов таким образом, который не полагается на объект, который не уничтожается, поэтому реализации должны быть уверены, что позволить функциям-членам продолжать выполнение, даже если объекты будут уничтожены.
Итак, чтобы ответить ваши вопросы:
Или это то, что этот указатель лямбда теперь недействителен (указывает на освобожденную память), поэтому никакие захваты лямбда не могут быть доступны, но если он запускает код, t использовать что-либо, что он захватывает, это не неопределенное поведение?
blockquote>Да, в значительной степени.
Кроме того, в том случае, когда лямбда является подвижной, любой другой?
blockquote>Нет, это не так.
Единственный раз, когда возможно перемещение лямбда, возможно, после перемещения лямбда. В вашем примере
operator()
продолжает выполняться на исходном перемещенном и затем уничтоженном функторе.
В конечном счете, в этом вопросе есть много деталей, которые не актуальны. Мы можем свести его к вопросу о достоверности:
struct A {
something_unmovable m;
void operator()() {
delete this;
// do something with m
}
};
И спросить об этом. В конце концов, влияние resize()
заключается в вызове деструктора объекта mid-function-call.
Стандарт сообщает нам в [class.cdtor], что:
< blockquote>Для объекта с нетривиальным деструктором, ссылаясь на любой нестатический член или базовый класс объекта после завершения выполнения деструктора, приводит к неопределенному поведению.
blockquote> So если деструктор something_unmovable
является нетривиальным (что сделало бы деструктор A
- или ваш лямбда - нетривиальным), любая ссылка на m
после вызова деструктора - это неопределенное поведение. Если something_unmovable
имеет тривиальный деструктор, то ваш код вполне приемлем. Если вы не выполняете что-либо после delete this
(resize()
в своем вопросе), то это совершенно правильное поведение.
До сих пор доступен доступ из вектор?
blockquote>Да, функтор в
vec[0]
по-прежнему будет иметьm
. Это может быть оригинальная лямбда - или это может быть копия оригинальной лямбды. Но будетm
так или иначе.
Вы можете обрабатывать лямбда-захваты, как обычные экземпляры структуры.
В вашем случае:
struct lambda_UUID_HERE_stuff
{
std::vector<std::function<void()>> &vec;
something_unmovable m;
void operator()()
{
this->vec.resize(100);
}
};
... и я считаю, что применяются все те же правила (что касается VS2013 )
Итак, это, по-видимому, еще один случай неопределенного поведения. То есть, если &vec
указывает на вектор, содержащий экземпляр захвата, а операции внутри operator()
вызывают изменение этого вектора.
&vec
указывает на вектор, содержащий структуру, то это UB. Обновление ...
– defube
18 July 2015 в 18:29
Объекты функций обычно можно копировать, поэтому ваша лямбда будет продолжать работать без какого-либо эффекта. Если он фиксирует по ссылке AFAIR, внутренняя реализация будет использовать std :: reference_wrapper, чтобы лямбда оставалась скопированной.