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

时间:2015-02-26 20:35:25

标签: 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()
{
}

修改

我认为这与以下内容的不同之处还在于编译

void foo()
{
}

void foo();

int main()
{
}

2 个答案:

答案 0 :(得分:5)

[basic.def] / 1:

  

声明(第7条)可以在a中引入一个或多个名称   翻译单位或之前介绍的重新声明名称   声明。

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

答案 1 :(得分:1)

看起来这是由3.3.1 / 4:

涵盖的
  

在单个声明性区域中给出一组声明,每个声明   它指定相同的非限定名称,

     

- 他们都应该参考   同一个实体,或全部引用功能和功能模板;或

然后8.3.5 / 5:

  

单个名称可用于单个中的多个不同功能   范围;这是函数重载(第13条)。所有声明   函数应完全同意返回类型和   参数类型列表。

这似乎清楚地表明你可以通过声明...agree exactly in both the return type and the parameter type- list.

来声明两次相同的函数