Difference between revisions of "C++17"

From Inkscape Wiki
Jump to navigation Jump to search
 
Line 49: Line 49:
{| class="wikitable"
{| class="wikitable"
|-
|-
!        !! GCC        !! Clang                                                               !! MSVC                                         
!        !! GCC        !! Clang                                             !! MSVC                                         
|-
|-
|C++17    || 7 (2017) || 4  (2017) (5 for constexpr lambda expressions)                       || 19.14 (2017)
|C++17    || 7 (2017)   || 4  (2017) (5 for constexpr lambda expressions)   || 19.14 (2017)
|-
|-
|C++20    || 10* (2020)       || 10* (2020)                                                                   || 19.25*
|C++20    || 10* (2020) || 10* (2020)                                         || 19.25*
|-
|-
|C++23
|C++23   || 14* (2024) || 14# (2022)                                         || 19.32#
|12#
|14# (2022)
|19.32#
|}
|}
'*' Mostly complete
'*' Mostly complete
'#' About half complete
'#' About half complete

Latest revision as of 08:44, 25 September 2024

Usage status

This table lists C++14 and C++17 features and whether they can be used in Inkscape or not (yet). Add C++14 or C++17 features that you would like to use to the table, so that we know what to test for to increase the C++17 "allowance".

See also C++11, C++20

Feature Since Can use? Comment
std::move and rvalues C++11 from 1.0 Allows passing ownership of internal resources between objects
enum class C++11 from 1.1 Strong enum constants (take the name of the enum, can't be implicitly converted to int)
std::make_unique<Foo>(…) C++14 from 1.1 Replaces std::unique_ptr<Foo>(new Foo(…))
constexpr C++14 from 1.1 Declares a variable as usable in a const expression
if constexpr C++17 from 1.1 Guarantees the branches will be decided at compile-time
std::variant<…> C++17 from 1.1 Type-safe union, where the contained type is known at runtime
std::optional<…> C++17 from 1.1 Object type (not a pointer or reference) which can either exist or be std::nullopt
auto [x, y] = foo(); C++17 from 1.1 Structured binding, for returning more than a single value
namespace A::B::C C++17 from 1.1 Nested namespaces
inline static const int C++17 from 1.1 Inline variables (inside header files)
std::filesystem C++17 not yet Filesystem library (may not be useful as we are using Gio::File). Also only supported from gcc 8, and Ubuntu 18.04 only has gcc 7. MacOS also doesn't support this.
toxic feature of doom NO Never use this (in case we stumble upon C++14/C++17 features that we really don't like)

Platform status

We need to keep coordinated with the section on Distro Dependencies.

Also see this page:

Note that __cplusplus is always 1 for GCC 4.6 that is used on Windows. So #if __cplusplus < 201103L or variants does not work to choose between C++03 or C++11 code.

C++17 is well supported by all major compilers.

Compiler version when feature complete:

GCC Clang MSVC
C++17 7 (2017) 4 (2017) (5 for constexpr lambda expressions) 19.14 (2017)
C++20 10* (2020) 10* (2020) 19.25*
C++23 14* (2024) 14# (2022) 19.32#

'*' Mostly complete '#' About half complete