¿Cómo funciona extern en espacios de nombres?

Estoy ejecutando un programa simple similar a lo que encontréaquí. Está destinado a reducir la hinchazón de código cuando se incluyen constantes en varios archivos. Lo hace mediante el uso de variables globales const dentro de un espacio de nombres con sus respectivosextern declaraciones a futuro.

globals.h

#ifndef GLOBALS_H_
#define GLOBALS_H_

namespace Constants
{
    // forward declarations only
    extern const double pi;
    extern const double avogadro;
    extern const double my_gravity;
}

#endif

globals.cpp

namespace Constants
{
    // actual global variables
    extern const double pi(3.14159);
    extern const double avogadro(6.0221413e23);
    extern const double my_gravity(9.2); // m/s^2 -- gravity is light on this planet
}

source.cpp

#include <iostream>
#include <limits>

#include "globals.h"

int main()
{
    double value_of_pi = Constants::pi;

    std::cout << value_of_pi;

    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cin.get();

    return 0;
}

Supongo que Constants :: pi obtiene el valor pi contenido en el espacio de nombres de Constantes globals.cpp, y es capaz de hacerlo porque tiene acceso al espacio de nombres en sí desde los globals.h incluidos. Lo que no entiendo es por quéconst definiciones / inicializaciones globales en globals.cpp necesita elextern ¿palabra clave? Traté de eliminar elextern palabras clave en globals.cpp pensando que no era necesario, pero mi programa no se ejecutará sin ellas. penséextern solo se usó para declaraciones a futuro? ¿Por qué son necesarios para elconst definiciones / inicializaciones globales? ¿Tiene algo que ver con el espacio de nombres en el que están definidos?

Respuestas a la pregunta(1)

Su respuesta a la pregunta