2016-05-10 153 views
9

使用reinterpret_cast將指向成員函數的指針轉換爲另一個指向同一類的成員函數是否合法?以下示例工作。但是合法嗎?將一個指向成員函數的指針指向另一個同類

#include<iostream> 
#include<vector> 
#include<string> 

class A 
{ 
    public: 
    void func_int(int x) { std::cout << x << std::endl; } 
    void func_string(std::string const& x) { std::cout << x << std::endl; } 
}; 

int main() 
{ 
    std::vector<void(A::*)()> v; 
    v.push_back(reinterpret_cast<void(A::*)()>(&A::func_int)); 
    v.push_back(reinterpret_cast<void(A::*)()>(&A::func_string)); 
    A a; 
    (a.*reinterpret_cast<void(A::*)(int)>(v[0]))(5); 
    (a.*reinterpret_cast<void(A::*)(std::string const&)>(v[1]))(std::string{"Test"}); 

    return 0; 
} 

回答

10

[expr.reinterpret.cast]的C++狀態草案:

類型「指針的T1類型的X構件」的prvalue可以顯式轉換到不同類型的「指針的prvalue到的構件Y類型T2「如果T1T2都是函數類型或兩種對象類型。 空成員指針值([conv.mem])被轉換爲目標類型的空成員指針值。這種轉換的結果是不確定的,除非是在下列情況下:

  • 類型的prvalue轉換「成員函數指針」到一個不同的成員函數指針類型和返回到其原始類型產生的原始指針以成員價值。

  • 類型的prvalue轉換「指針的T1類型的X數據成員」的類型「指針的T2類型的Y數據成員」(其中的T2的對準要求並不比的T1嚴格)並返回到其原始類型產生原來的指向成員值。

72)T1T2可以具有不同的CV -qualifiers,受該一reinterpret_cast不能拋棄常量性整體限制。

由於您正在將「指針指向成員函數」轉換爲不同的「指向成員函數的指針」類型,並返回,因此會生成原始值。這是既合法又明確的行爲。所以你的代碼應該正常工作。

相關問題