namespace :: function()声明何时有用?

Lon*_*ner 6 c++ namespaces declaration function

单个文件示例

这是一个使用命名空间的简单程序.

#include <iostream>

namespace foo {
    void hello();
}

void foo::hello() {
    std::cout << "hello\n";
}

void foo::hello(); // Why is this syntax allowed? When is it useful?

int main() {
    foo::hello();
}
Run Code Online (Sandbox Code Playgroud)

该程序编译良好并产生预期的输出.

$ ./a.out
hello
Run Code Online (Sandbox Code Playgroud)

我想知道void foo::hello();声明什么时候有用?在这个程序中,显然这个声明是多余的.但是由于存在这种语法,这在其他情况下必须有用吗?

双文件示例

这是一个例子,表明void foo::hello();独立的声明是无用的.

// foo.cpp
#include <iostream>

namespace foo {
    void hello();
}

void foo::hello() {
    std::cout << "foo::hello\n";
}
Run Code Online (Sandbox Code Playgroud)
// main.cpp
void foo::hello(); // This does not work!

int main()
{
    foo::hello();
}
Run Code Online (Sandbox Code Playgroud)

尝试编译上述两个文件会导致以下错误:

$ clang++ foo.cpp main.cpp
main.cpp:1:6: error: use of undeclared identifier 'foo'
void foo::hello();
     ^
main.cpp:5:5: error: use of undeclared identifier 'foo'
    foo::hello();
    ^
2 errors generated.
Run Code Online (Sandbox Code Playgroud)

main.cpp在上面的例子中修复的唯一方法似乎是包含namespace声明:

// main.cpp - fixed
namespace foo {
    void hello();
}

void foo::hello(); // But now this is redundant again!

int main()
{
    foo::hello();
}
Run Code Online (Sandbox Code Playgroud)

因此,在我们正确编译此代码之后,void foo::hello();声明似乎又是多余的.是否有任何情况下这样的声明会起到有用的作用?

asc*_*ler 3

在 C++ 中的大多数情况下,对于任何可以在不定义的情况下声明或可以完全定义的事物,该事物的声明或定义可以出现在所有相同的上下文中。所以这可能只是保持模式一致的一种方法。

C++ 标准不会特意禁止那些是其其他规则的逻辑结果但只是无用的事情,只要相当清楚如果有人这样做将会发生什么。如果它确实添加了这些限制,就会给编译器编写者带来额外的工作,但没有真正的好处。