Como o extern trabalha nos namespaces?

Estou executando um programa simples semelhante ao que encontreiaqui. Ele visa reduzir o inchaço do código ao incluir constantes em vários arquivos. Isso é feito usando variáveis globais const dentro de um espaço para nome com seus respectivosextern declarações avançadas.

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;
}

Suponho que Constants :: pi obtenha o valor pi contido no espaço de nomes constantes globals.cpp, e é capaz de fazê-lo porque tem acesso ao próprio espaço de nomes a partir de globals.h incluído. O que eu não entendo é por que odefinições / inicializações globais const&nbsp;no globals.cpp precisa doextern&nbsp;palavra-chave? Eu tentei remover oextern&nbsp;palavras-chave em globals.cpp pensando que não era necessário, mas meu programa não será executado sem elas. eu penseiextern&nbsp;foi usado apenas para declarações futuras? Por que eles são necessários para odefinições / inicializações globais const? Tem algo a ver com o espaço para nome em que estão definidos?