2011-07-02 62 views
9

Tôi có một số vấn đề khi dùng decltype cho con trỏ hàm thành viên:Sử dụng decltype với con trỏ hàm thành viên

#include <iostream> 
#include <type_traits> 

struct A 
{ 
    void func1() {} 
    typedef decltype(&A::func1) type; 
}; 

int wmain(int argc, wchar_t* argv[]) 
{ 
    typedef decltype(&A::func1) type; 

    //Case 1 
    std::wcout 
     << std::boolalpha 
     << std::is_member_function_pointer<type>::value 
     << std::endl; 

    //Case 2 
    std::wcout 
     << std::boolalpha 
     << std::is_member_function_pointer<A::type>::value 
     << std::endl; 

    system("pause"); 
    return 0; 
} 

Trường hợp 1 in true như mong đợi, nhưng Trường hợp 2 in false.

Có phải là decltype loại bỏ thuộc tính "thành viên" của một loại không? Nếu vậy, tại sao?

Ngoài ra, có cách nào để ngăn chặn hành vi này không? Tôi cần lấy loại chức năng thành viên bất kể tôi sử dụng ở đâu decltype.

Vui lòng trợ giúp.

EDIT:

Reported to Microsoft

+2

Có vẻ như một hạn chế khác với 'decltype' trong việc triển khai MSVC hiện tại ... – Xeo

+5

Chỉ cần kiểm tra với gcc 4.7, nó xuất ra' true' cho cả hai trường hợp. – Vitus

+2

@Xeo @Vitus Cảm ơn. Microsoft hủy hoại mọi thứ ... – Nubcase

Trả lời

3

Vì lợi ích của hình thức (có một câu trả lời cho câu hỏi), điều này dường như là một lỗi trong trình biên dịch VC2010 của. Gửi báo cáo lỗi để Microsoft có thể sửa lỗi trong phiên bản tiếp theo.

Các vấn đề liên quan