2013-06-02 17 views
7

Các mã sau đây:Tại sao bạn không thể lấy con trỏ tới thành viên từ tên hàm thành viên không đủ tiêu chuẩn trong C++ 11?

struct X 
{ 
    void f() {} 

    void g() 
    { 
     auto h = &f; 
    } 
}; 

kết quả trong:

error: ISO C++ forbids taking the address of an unqualified 
or parenthesized non-static member function to form a pointer 
to member function. Say ‘&X::f’ 

Câu hỏi của tôi là, tại sao được này không được phép và bị cấm theo tiêu chuẩn? Nó sẽ thuận tiện hơn khi người dùng tham chiếu đến nó không đủ tiêu chuẩn, vì vậy tôi cho rằng có một số lý do khác (an toàn? Một sự mơ hồ? Dễ thực hiện trình biên dịch?) Cho yêu cầu?

+0

câu trả lời trước này dường như để giải quyết các câu hỏi: http://stackoverflow.com/a/7138582 –

Trả lời

6

con trỏ thành viên đủ hiếm để cho phép điều trị đặc biệt và không nhất thiết là điều trị kinh tế nhất. Nó đã được quyết định rằng hình thức chấp nhận duy nhất là một trong những trích dẫn trong thông báo lỗi. Hình thức đó không đụng độ với bất cứ điều gì khác trong bất kỳ trường hợp nào. Và ngăn ngừa sự mơ hồ của các hình thức lỏng lẻo hơn được cho phép.

Thực hành cho thấy ít nhận thức về PTMF và thực tế về cơ bản chúng khác với chức năng. f hoặc & f có khả năng là một yêu cầu cho một chức năng bình thường. Một cái không thể được phục vụ cho một thành viên không phải là thành viên. Và những người thực sự có nghĩa là PTMF nói thêm phần & X ::.

+1

Tôi không có ý để được thô lỗ trong yêu cầu sau - nhưng là câu trả lời của bạn đầu cơ? hoặc bạn có hiểu biết trực tiếp rằng đây là lý do đằng sau quyết định? –

+1

không hoàn toàn suy đoán. Tôi đã hỏi câu hỏi này 10+ năm trước trên comp.std.C++ đối mặt với một vấn đề tương tự lần đầu tiên. (Mã chuyển mã IIRC từ MSVC5 đến gcc có độ cầu kỳ cao hơn). Đó là hồi ức tốt nhất của tôi về câu trả lời tôi nhận được từ mọi người, chủ yếu là thực sự làm việc trong hoặc bởi WG21. Bạn có thể thử đào một trong những chủ đề đó. –

0

Bạn đang dùng địa chỉ của hàm thành viên, không phải chức năng và điều đó có nghĩa là bạn cũng sẽ phải gọi hàm đó theo cách khác.

struct X 
{ 
    void f() {} 

    void g() 
    { 
     auto h = &X::f; 
     h(); 
    } 
}; 

Tạo:

 
error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘h (...)’, e.g. ‘(... ->* h) (...)’ 
Các vấn đề liên quan