Лямбда-захваты по сути являются переменными-членами лямбда-объекта. Как таковые, они не подлежат какой-либо форме исключения, ни в их инициализации, ни в их использовании при перегрузке operator()
лямбды.
И поскольку вызовы конструктора / деструктора являются наблюдаемым поведением, компилятор не допускается не вызывать их в соответствии с правилом «как будто» (если только компилятор не увидит код для этих конструкторов / деструкторов и не сможет доказать, что у них нет видимых побочных эффектов. Он также должен будет следовать по пути этой лямбды ваша кодовая база, между прочим. Так что, в принципе, не рассчитывайте на это).
При этом возвращение самой лямбды в соответствии с правилами C ++ 17 не будет вызывать копирование / перемещение лямбды и, следовательно, никаких дополнительных копий / перемещений членов этой лямбды не потребуется.
будет ли захват по значению для w вызывать конструктор перемещения Widget?
Нет. Поименные значения всегда копируются.