2017-01-23 95 views
0

我想檢查一個完全合格的名稱和一個非限定名稱或部分限定名稱是否引用相同的符號,即使沒有定義一個名稱。也就是說,我希望能夠寫這樣的事情作爲重構工具的一部分:如何檢查一個名稱是否與另一個名稱相同?

namespace A { 
void f() {}; 
} 

namespace B { 
namespace A {}; 

    bool g() { 
    // returns false 
    return is_same_symbol<A::f, ::A::f>::value; 
    } 
} 

namespace C { 
    bool h() { 
    // returns true 
    return is_same_symbol<A::f, ::A::f>::value; 
    } 
} 
+1

「我想檢查是否能夠檢查兩個不同的符號是否指向同一事物,即使其中一個不存在。」這沒有什麼意義。 –

+0

@NeilButterworth是的,我知道,我不知道如何表達它。我想有一種更好的方式來說這是「我想檢查一個完全合格的名稱和一個不合格或部分合格的名稱是否指向相同的符號」 –

+2

如果一個符號沒有定義,並且您嘗試使用它,你會得到一個編譯器錯誤,很簡單。 – AndyG

回答

0

你澄清評論:

我試圖找出正確的SFINAE咒語用於檢查給定名稱的自由功能是否存在。

你不行。

當你說一個名爲foo免費函數存在,你是什麼意思?

它必須是以下之一:

編譯器已經看到的foo聲明:

... int foo(int i); 

或:

編譯器已經看到的foo一個定義:

... int foo(int i) { 
    ... 
    return ...; 
} 

定義也是一個聲明,所以如果編譯器沒有看到foo的聲明 那麼它還沒有看到一個定義。

假設您正在嘗試SFINAE-probe是否聲明瞭foo。 如果編譯器甚至沒有見過的foo的聲明則你寫的任何 後續代碼使用foo的名字會招來 在靜脈編譯錯誤:

error: use of undeclared identifier 'foo' 

你可以不寫代碼到SFINAE-probe是否聲明foo是因爲 您不能編寫使用未聲明名稱的C++句號。

假設您正在嘗試SFINAE-探針foo是否爲定義爲。 要做到這一點,首先必須有foo的的聲明 - 要麼是 ,要麼是你自己寫的,或者是你從某個頭文件中獲得的。

當然不過,鑑於foo聲明,編譯器無法分辨是否 與否它被定義並不在乎,除非在特殊情況下,該功能 被聲明爲staticinline或匿名命名空間。否則,它將發現或未找到對鏈接器的定義。

通常,然後,SFINAE-探測功能定義的存在同樣是 非起動器。即使foo聲明staticinline或在一個匿名的命名空間,且缺乏編譯單元內的定義,即在其聲明符合使用foo任何 代碼保持合式 代碼;所以即使在那些情況下,SFINAE-探測它的定義仍然沒有意義。

相關問題