In your current example there is no difference: On variable declarations, constexpr implies const, and a const variable at namespace scope has internal linkage by default (so adding static does not change anything).
In C++14, you cannot declare a variable as constexpr and have it have external linkage unless you only ever do this in one single translation unit. The reason is that constexpr variables require an initializer, and a declaration with initializer is a definition, and you must only have a single definition.
However, what you can do is use a normal integral constant, which you can declare (not define) as extern, and in the translation unit where it is defined it can even be used as a constant expression:
lib.h:
extern const int a;
lib.cpp:
#include "lib.h" const int a = 10; int b[a] = {1, 2, 3}; // OK in this translation unit
In C++17, there is a new feature "inline variables" which lets you say:
inline constexpr int a = 10;
And this is an "inline definition" that can appear repeatedly, and each definition defines the same entity (just like all the other "inline" entities in the language).
constexprimpliesconst.constimpliesstatic.constexpron variables impliesconst, and const integral variables at namespace scope have internal linkage by default.extern const intis valid, butextern static const intis not -- so thestaticis not as much "implied" as it is a "default" of sorts.constexprnorstatic constexprwould allow me to get the same object across separate translation units?extern const intinstead (which is still suitable as a constant expression in the TU that defines it, since you need an initializer to be usable as a constant expression). In C++17 you would useinline constexpr int a = 10;to get a single object.