Owning raw pointers have been replaced by smart pointers. Notably, WWidget(WContainerWidget*) and WContainerWidget::addWidget(WWidget*) have been replaced by WContainerWidget::addWidget(std::unique_ptr<WWidget>) . Also, some objects that had a single owner before, like WAbstractItemModel and WValidator , are now shared.

Enums were replaced by enum classes

Wt 4 relies less on Boost, preferring the standard library where possible. If you build Wt with standalone Asio, then the header files don’t include any Boost headers anymore. This has significantly reduced the size of our Windows installers, and should considerably speed up compilation times.

Boost.Signals2 has been replaced by a new implementation that should offer better performance and easier debugging due to shorter, more understandable stack traces. Also, you don’t need to std::bind away extra arguments when using lambda functions now.

Boost.Date_Time has been replaced by Howard Hinnant’s std::chrono -based date implementation.

Boost.Any has been replaced by Wt::cpp17::any . The implementation can be switched at compile time between std::any , std::experimental::any , or (by default) an included implementation that implements the small object optimization.

The use of Wt header files without .h has been deprecated, because this often confused IDEs and yielded no real benefit.

There’s a new default implementation for WBoxLayout that leverages flexbox instead of relying on JavaScript code to detect resizes.