Hiểu khoảng trống func (A ())


8

Đây là mã của tôi

#include <iostream>

class A {
public:
    int a = 0;
    A(int i = 0) : a(i) {}
};

void func(A())
{
    std::cout << "Hello" << std::endl;
}

int main()
{
    A(*p)() = NULL;
    func(p);
}

Điều làm tôi bối rối là A()trong void func(A())bằng với A (*)()thay vì hàm Atạo. Cái này hoạt động ra sao?


1
Điều đó có nghĩa là gì khi A()là nhà Axây dựng?
idclev 463035818

Bất cứ điều gì có thể được phân tích cú pháp như một khai báo hàm là khai báo hàm. Tra cứu "hầu hết các phân tích vexing" . Không thể tìm thấy một bản sao chính tắc nhưng rất nhiều tương tự.
Richard Critten


@ Adrian-ReinstateMonica Cảm ơn, tôi thấy rằng một - vì Q này rất phổ biến đã hy vọng cho số phiếu cao hơn.
Richard Critten

@RichardCritten Tôi không chắc điều này có liên quan đến Phân tích cú pháp nhiều nhất, vì điều này đặc biệt trong ngữ cảnh của một khai báo hàm nơi các phân tích cú pháp khác không thể (?) Áp dụng. Nhưng có lẽ tôi đã nhầm?
templatetypedef

Câu trả lời:


9

Hãy lý luận bằng cách tương tự. Nếu bạn xác định một chức năng

void doSomething(A [137]) {

}

sau đó C ++ coi nó như thể bạn thực sự đã viết

void doSomething(A *) {

}

Nói cách khác, có một số loại trong đó, nếu bạn sử dụng chúng làm tham số cho hàm, C ++ sẽ tự động thay thế chúng bằng một loại khác, loại bạn nhận được bằng cách phân rã loại.

Trong trường hợp của bạn, A()là loại hàm không có đối số và trả về một A. Nếu bạn có một hàm C ++ lấy tham A()số làm đối số, thay vào đó C ++ sẽ có hàm lấy làm đầu vào A (*)(), một con trỏ tới hàm không có đối số và trả về một A. Lý do cho điều này là bạn không thể có một đối tượng loại A()trong C ++, mặc dù bạn có thể có một con trỏ tới một A().

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.