以下位代码,其中函数定义预先声明其声明,在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()
{
}
答案 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.