2016-05-10 40 views
9

reinterpret_cast kullanarak aynı sınıfa ait başka bir işaretçi-üye işlevine işaretçi-üye işlevini yayınlamak yasal mıdır? Aşağıdaki örnek çalışır. Ama yasal mı? [expr.reinterpret.cast] C++ taslak devletler deBir işaretçi-üye işlevini aynı sınıftan başka birine atama

#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; 
} 

cevap

10

:

“türü T1 ait X üyesine pointer” türünde bir prvalue açıkça üyesi için farklı bir türü “göstericinin bir prvalue dönüştürülebilir türünde T2 " T1 ve T2 ise işlev türleri veya her iki nesne türü. Boş üye işaretçi değeri ( [conv.mem]), hedef türünün boş üye işaretçi değerine dönüştürülür. Bu dönüşümün sonucu, aşağıdaki durumlar hariç, tanımlanmamış olan:

  • elemanı işlevi türüne farklı işaretçi “üye fonksiyonuna işaretçi” tipi bir prvalue dönüştürülmesi ve tekrar orijinal tip özgün işaretçi verir üye değerine

  • “tipi T2 arasında Y veri elemanına pointer” tipi “tipi T1 arasında X veri elemanına işaretçi” tipi bir prvalue dönüştürülmesi (T2 hizalama şartlar T1 kişilerce daha sıkı olduğu) ve orijinal türüne geri döndüğünde, orijinal işaretçiyi üye değerine verir.

72) T1 ve T2

bir reinterpret_cast constness fırlatmak olamaz genel kısıtlamaya tabi olan farklı ev -qualifiers sahip olabilir.

"İşaretçiyi üye işlevine" farklı bir "üye işlevine işaretçi" türüne dönüştürdüğünüze göre, bu, özgün değeri verir. Bu hem yasal hem de iyi tanımlanmış bir davranıştır. Yani kodunuz düzgün çalışmalı.

İlgili konular