[英]Is a fully qualified class name down to global scope ever required for out-of-line member function definitions?
這個問題讓我想知道在類外成員 function 定義中完全限定 class 名稱(包括全局 scope 運算符)是否有用/有必要。
一方面,我以前從未見過這樣做(而且正確執行此操作的語法似乎晦澀難懂)。 另一方面,C++ 名稱查找非常重要,因此可能存在極端情況。
問題:
是否有過引入類外成員 function 定義的情況ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) {... }
將不同於
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) {... }
(沒有全局 scope ::
前綴)?
請注意,成員 function 定義必須放在包含 class 的命名空間中,因此這不是一個有效的示例。
使用指令可能導致Fully
不明確而沒有限定。
namespace Foo {
struct X {
};
}
using namespace Foo;
struct X {
void c();
};
void X::c() { } // ambiguous
void ::X::c() { } // OK
如果一個人是受虐狂並且喜歡寫這樣的東西,這是必要的
namespace foo {
namespace foo {
struct bar {
void baz();
};
}
struct bar {
void baz();
};
void foo::bar::baz() {
}
void (::foo::bar::baz)() {
}
}
當然可以在全局 scope 中將第二個重載寫為foo::foo::bar::baz
,但問題是這兩個聲明是否可以具有不同的含義。 我不建議編寫這樣的代碼。
如果使用 using 指令,則可能會出現令人困惑的代碼。
考慮以下演示程序
#include <iostream>
#include <string>
namespace N1
{
struct A
{
void f() const;
};
}
using namespace N1;
void A::f() const { std::cout << "N1::f()\n"; }
struct A
{
void f() const;
};
void ::A::f() const { std::cout << "::f()\n"; }
int main()
{
N1::A().f();
::A().f();
return 0;
}
因此,為了便於閱讀,這個限定名稱
void ::A::f() const { std::cout << "::f()\n"; }
准確顯示了 function 的聲明位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.