Difference between revisions of "C++17"

From Inkscape Wiki
Jump to navigation Jump to search
(Add structured binding)
(Add enum class)
Line 7: Line 7:
! Feature !! Since !! Can use? !! Comment
! Feature !! Since !! Can use? !! Comment
|-
|-
| std::make_unique<Foo>(…) || C++14 ||  style="background: lightgreen;" | from 1.1 || Replaces std::unique_ptr<Foo>(new Foo(…))
| <code>enum class</code> || C++11 ||  style="background: lightgreen;" | from 1.1 || Strong enum constants (take the name of the enum, can't be implicitly converted to <code>int</code>)
|-
|-
| constexpr || C++14 ||  style="background: lightgreen;" | from 1.1 || Declares a variable as usable in a const expression
| <code>std::make_unique<Foo>(…)</code> || C++14 ||  style="background: lightgreen;" | from 1.1 || Replaces <code>std::unique_ptr<Foo>(new Foo(…))</code>
|-
|-
| if constexpr || C++17 ||  style="background: lightgreen;" | from 1.1 || Guarantees the branches will be decided at compile-time
| <code>constexpr</code> || C++14 ||  style="background: lightgreen;" | from 1.1 || Declares a variable as usable in a const expression
|-
|-
| std::variant<> || C++17 ||  style="background: lightgreen;" | from 1.1 || Type-safe union, where the contained type is known at runtime
| <code>if constexpr</code> || C++17 ||  style="background: lightgreen;" | from 1.1 || Guarantees the branches will be decided at compile-time
|-
|-
| std::optional<…> || C++17 ||  style="background: lightgreen;" | from 1.1 || Object type (not a pointer or reference) which can either exist or be nullopt
| <code>std::variant<…></code> || C++17 ||  style="background: lightgreen;" | from 1.1 || Type-safe union, where the contained type is known at runtime
|-
|-
| auto [x, y] = foo() || C++17 ||  style="background: lightgreen;" | from 1.1 || Structured binding, for returning more than a single value
| <code>std::optional<…></code> || C++17 ||  style="background: lightgreen;" | from 1.1 || Object type (not a pointer or reference) which can either exist or be <code>std::nullopt</code>
|-
| <code>auto [x, y] = foo();</code> || C++17 ||  style="background: lightgreen;" | from 1.1 || Structured binding, for returning more than a single value
|-
|-
| toxic feature of doom || || style="background: red;" | NO || Never use this (in case we stumble upon C++14/C++17 features that we really don't like)
| toxic feature of doom || || style="background: red;" | NO || Never use this (in case we stumble upon C++14/C++17 features that we really don't like)

Revision as of 11:23, 13 April 2020

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".

Feature Since Can use? Comment
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
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* 10* 19.22#

'*' Mostly complete '#' About half complete