Следующий код предположительно является незаконным в С++ 14, но является законным в С++ 17:
#include <functional>
int main()
{
int x = 1729;
std::function<void (int&)> f(
[](int& r) { return ++r; });
f(x);
}
Не утруждайте себя тестированием, вы получите противоречивые результаты, затрудняющие вопрос о том, является ли это ошибкой или преднамеренным поведением. Однако, сравнивая два черновика (N4140 против N4527, их можно найти на github.com/cplusplus/draft), есть одна существенная разница в [func.wrap.func.inv]. Пункт 2:
Возвращает: ничего, если R является void, иначе возвращаемое значение INVOKE (f, std:: forward (args)..., R).
Вышеуказанное было удалено между черновиками. Импликация заключается в том, что возвращаемое значение лямбда теперь тихо отбрасывается. Это кажется неправильной. Может ли кто-нибудь объяснить рассуждения?