簡體   English   中英

離線成員 function 定義是否需要完全限定的 class 名稱到全局 scope?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM