Files
MapLibreParticleLab/DEVELOPING.md
2017-07-19 19:24:30 +03:00

3.3 KiB

Modern C++ support

Mapbox GL Native supports the C++14 standard, and encourages contributions to the source code using modern C++ idioms like return type deductions, generic lambdas, std::optional and alike. However, we do not support all the features from the final draft of the C++14 standard - we had to sacrifice support for these features in order to support GCC from version 4.9 onwards.

The following C++14 features are not supported in Mapbox GL Native:

C++14 variable templates

Constructs like the example below are not supported:

template<typename T> constexpr T pi = T(3.14);

Workarounds:

  • If the variable is an alias, use the call the alias points to: example
// auto foo = pi<double>;
auto foo = double(3.14);

C++14 aggregates with non-static data member initializers

Constructs like the example below are not supported:

struct Foo {
    int x = { 0 };
};

// error: no matching function for call to 'Foo::Foo(<brace-enclosed initializer list>)'
int main() {
    Foo foo { 0 };
    return 0;
}

Workarounds

  • Replace data member initializers with default parameter values in default constructors:
struct Foo {
    Foo(int x_ = 0) : x(x_) {}
    int x;
};

int main() {
    Foo foo { 0 }; // works with default constructor
    return 0;
}
  • Replace bracket initialization with regular round brackets or none:
struct Foo {
    Foo(int x_ = 0) : x(x_) {}
    int x;
};

int main() {
    Foo foo(); // works
    Foo bar; // also works
    return 0;
}

Extended constexpr support

GCC 4.9 strictly forbids constexpr usage in the following scenarios:

  • No local variable declarations (not static or thread_local, and no uninitialized variables)
  • Cannot mutate objects whose lifetime began with the constant expression evaluation
  • Disable usage of if, switch, for, while, do-while (not goto) inside constexpr expressions
  • Enforces that constexpr member functions are implicitly const
// sorry, unimplemented: use of the value of the object being constructed
// in a constant expression
struct Foo {
    int x, y;
    constexpr Foo(int i) : x(i), y(x) {}
};

// error: body of constexpr function 'constexpr int test1(int)' not a
// return-statement
constexpr int test1(int i) {
    int j = i;
    return j;
}

// error: body of constexpr function 'constexpr bool test2(int)' not a
// return-statement
constexpr bool test2(int i) {
    if (i > 0) {
        return true;
    } else {
        return false;
    }
}

Workarounds

  • Either remove constexpr specifier or replace it with inline in case of functions