函数定义在命名空间中的声明之前

Olu*_*ide 2 c++ namespaces forward-declaration

下面的代码,其中函数定义预先声明其声明,在VS .NET 2008和Cygwin gcc 4.8.2中编译.这合法吗?

namespace N
{
    int init()      // Definition appears first
    {
        return 42;
    }       
}

namespace N
{
    int init();     // followed by declaration
    const int x = init();
}

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

编辑

我想这与下面的编译并没有太大区别

void foo()
{
}

void foo();

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

Col*_*mbo 5

[basic.def]/1:

声明(第7条)可以将一个或多个名称引入翻译单元或重新声明先前声明引入的名称.

在声明与先前声明一致的情况下,可以随时(重新)声明一个名称.在这种情况下,它是一致的,因为init两个声明中的类型都是int().所以,是的,代码格式正确.