Difference between revisions of "C++20"

From Inkscape Wiki
Jump to navigation Jump to search
(Update for Ubuntu 24.04)
 
(22 intermediate revisions by 3 users not shown)
Line 1: Line 1:


See also [[C++11]], [[C++17]].
See also [[C++11]], [[C++17]], [[C++23]].


Some things that will be interesting to use once C++20 is common:
Some things that will be interesting to use once C++20 is common:
Line 6: Line 6:
{| class="wikitable"
{| class="wikitable"
|-
|-
! Feature !! Since !! Can use? !! Comment
! Feature                           !! Since !! Can use?                                   !! GCC    !! Apple Clang !! Comment
|-
|-
| <code>std::span</code> || C++20 || style="background: lightgreen;" | from 1.3? || Handle buffers like standard library containers without risk of overflow. (OK on MacOS)
| <code>std::span</code>           || C++20 || style="background: lightgreen;" | from 1.4  || 10    || 11.0.3 || Handle buffers like standard library containers without risk of overflow.
|-
|-
| <code>std::format</code>|| C++20 || style="background: lightgreen;" | from 1.4? || Better and more efficient formatting of strings.
| <code>std::format</code>         || C++20 || style="background: pink;"       |   not yet || 13    || 15.|| Better and more efficient formatting of strings. [https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html Text Formatting]
|-
|-
| <code>std::lerp</code> || C++20 ||                                   from 1.4? || Linear interpolation.
| <code>std::lerp</code>           || C++20 || style="background: lightgreen;" | from 1.4 ||  9    || 11.0.3 || Linear interpolation. (ui/tools/pencil-tool.cpp)
|-
|-
| <code>std::bit_floor</code> || C++20 ||                               from 1.4? ||  
| <code>std::bit_floor</code>       || C++20 || style="background: lightgreen;" | from 1.4 || 9/10  || 11.0.3/13.0.0 || Compute <code>floor(log2(x))</code>. (helper/mathfns.h)
|-
|-
| <code>Concepts</code    || C++20 ||                                  from 1.4? || Safer templating.
| Concepts                         || C++20 ||                                  from 1.4? || 6/10  || 12.0.0 Partial || Safer templating. (ui/controller.h)
|-
|-
| <code>std::make_unique_for_overwrite</code> || C++20 ||               from 1.4? ||
| Coroutines                        || C++20 || style="background: pink;" |        not yet || 10    || 10.0.1 Partial,<br/> 15.3 Full || Simpler asynchronous code. (trace/trace.cpp)
|-
|-
| <code>Ranges</code>     || C++20 ||                                   from 1.4? ||
| <code>std::make_unique_for_overwrite</code>
                                    || C++20 || style="background: pink;" |        not yet || 11    || 15.0.0 || Don't zero arrays allocated using std::make_unique. (util/pool.cpp)
|-
|-
| <code>Structural Templates</code> || C++20 ||                         from 1.4? ||
| Ranges                            || C++20 || style="background: pink;" |        not yet ||        || ? || (ui/dialog/swatches.cpp)
|-
| [https://stackoverflow.com/a/60244416/5075760 Structural templates]
                                    || C++20 ||                                  from 1.4? ||        || Partial || Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)
|-
| Mathematical Constants            || C++20 ||                                            || 10    || 12.0.5 || Constants like <code>std::numbers::pi</code>.
|-
| Heterogenous lookup in <code>std::unordered_map</code>
                                    || C++20 || style="background: pink;" |        not yet ||        ||        || Faster lookup, use of smart pointers as keys.
|-
|<code>consteval static</code> member functions
|C++20
| style="background: pink;" | not yet
|
|
|Guaranteed compile time evaluation of member functions (stronger than <code>constexpr</code>)
|}
|}
References:
* General: https://en.cppreference.com/w/Template:cpp/compiler_support/20
* Apple Clang: https://developer.apple.com/documentation/xcode-release-notes
As of 10 July 2024, the CI runners for the various supported platforms are
* Linux:
** appimage:linux: GNU 13.2.0 (building on Ubuntu 24.04)
** inkscape:linux: Same as above
* Windows
** inkscape:windows:build: GNU 13.2.0
** inkscape:windows:dist: Same as above
* macOS:
** inkscape::macos:arm: Apple Clang 15.0.0
** inkscape:macos:x64: Apple Clang 13.0.0 (temporarily disabled since GTK4 port)
We strive to support latest Debian stable and latest Ubuntu LTS.
{| class="wikitable"
|-
! Distro                        || gcc    || clang  || glib || glibmm || gtk4 || gtkmm4 || Can build?
|-
| Debian 12 (Bookworm, stable)  || 12.2.0 || 15.0.6 || style="background: pink;" | 2.74.6 || style="background: pink;" | 2.74.0 || style="background: wheat;" | 4.8.3 || style="background: wheat;" | 4.8.3 || ❌
|-
| Ubuntu 24.04 (Noble)          || 13.2.0 || 18.1.3 || 2.80.0 || 2.78.1 || 4.14.2 || style="background: wheat;" | 4.10.1 || ✅
|}
The build requires glibmm >= 2.78.1 and gtkmm4 >= 4.14. The build system will supply its own gtkmm4 if out-of-date. Therefore the build only currently works out of the box on Ubuntu 24.04.
Deprecated items that we still use:
* warning: implicit capture of ‘this’ via ‘[=]’ is deprecated in C++20 [-Wdeprecated] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0806r2.html
* warning: bitwise operation between different enumeration types ‘Box3D::Axis’ and ‘Box3D::FrontOrRear’ is deprecated [-Wdeprecated-enum-enum-conversion]

Latest revision as of 00:50, 10 July 2024

See also C++11, C++17, C++23.

Some things that will be interesting to use once C++20 is common:

Feature Since Can use? GCC Apple Clang Comment
std::span C++20 from 1.4 10 11.0.3 Handle buffers like standard library containers without risk of overflow.
std::format C++20 not yet 13 15.3 Better and more efficient formatting of strings. Text Formatting
std::lerp C++20 from 1.4 9 11.0.3 Linear interpolation. (ui/tools/pencil-tool.cpp)
std::bit_floor C++20 from 1.4 9/10 11.0.3/13.0.0 Compute floor(log2(x)). (helper/mathfns.h)
Concepts C++20 from 1.4? 6/10 12.0.0 Partial Safer templating. (ui/controller.h)
Coroutines C++20 not yet 10 10.0.1 Partial,
15.3 Full
Simpler asynchronous code. (trace/trace.cpp)
std::make_unique_for_overwrite C++20 not yet 11 15.0.0 Don't zero arrays allocated using std::make_unique. (util/pool.cpp)
Ranges C++20 not yet ? (ui/dialog/swatches.cpp)
Structural templates C++20 from 1.4? Partial Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)
Mathematical Constants C++20 10 12.0.5 Constants like std::numbers::pi.
Heterogenous lookup in std::unordered_map C++20 not yet Faster lookup, use of smart pointers as keys.
consteval static member functions C++20 not yet Guaranteed compile time evaluation of member functions (stronger than constexpr)

References:

As of 10 July 2024, the CI runners for the various supported platforms are

  • Linux:
    • appimage:linux: GNU 13.2.0 (building on Ubuntu 24.04)
    • inkscape:linux: Same as above
  • Windows
    • inkscape:windows:build: GNU 13.2.0
    • inkscape:windows:dist: Same as above
  • macOS:
    • inkscape::macos:arm: Apple Clang 15.0.0
    • inkscape:macos:x64: Apple Clang 13.0.0 (temporarily disabled since GTK4 port)

We strive to support latest Debian stable and latest Ubuntu LTS.

Distro gcc clang glib glibmm gtk4 gtkmm4 Can build?
Debian 12 (Bookworm, stable) 12.2.0 15.0.6 2.74.6 2.74.0 4.8.3 4.8.3
Ubuntu 24.04 (Noble) 13.2.0 18.1.3 2.80.0 2.78.1 4.14.2 4.10.1

The build requires glibmm >= 2.78.1 and gtkmm4 >= 4.14. The build system will supply its own gtkmm4 if out-of-date. Therefore the build only currently works out of the box on Ubuntu 24.04.

Deprecated items that we still use: