3.3 KiB
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
staticorthread_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
constexprspecifier or replace it withinlinein case of functions