As Quentin noted, project n4296 clearly states that in chapter 3.5 “Program and Communication” [basic.link] §3 (emphasize mine)
A name that has a namespace scope (3.3.6) has an internal relationship if that name
(3.1) - a template for a variable, function, or function that is explicitly declared static; or,
(3.2) - a variable from a non-volatile type with a constant const , which is not explicitly declared extern or previously declared to have an external connection;
When you declare arr constant, it is implicitly specified by the internal link. Committing is trivial:
extern const char* const arr[2] = {"Hello", "World"};
However, best practice would recommend having extern const char* const arr[2]; in the header included in all files, using arr to correctly share the declaration, and then add const char* const arr[2] = {"Hello", "World"}; to one of these files const char* const arr[2] = {"Hello", "World"}; effectively yielding:
extern const char* const arr[2];
source share