typeid(A::i).name()
không hoàn toàn làm những gì tôi nghĩ rằng nó sẽ làm. Tôi hy vọng nó là một con trỏ thành viên, nhưng nó thực sự chỉ là một int
.
Để thấy điều này, chạy mã này:
#include <iostream>
struct A{ int i; };
struct B{ int i; void f(void); };
template<typename T>
void what_is_my_type() {
std:: cout << __PRETTY_FUNCTION__ << std:: endl;
}
int main()
{
what_is_my_type<decltype(&A::i)>(); // "void what_is_my_type() [T = int A::*]"
what_is_my_type<decltype(&B::i)>(); // "void what_is_my_type() [T = int B::*]"
what_is_my_type<decltype(&B::f)>(); // "void what_is_my_type() [T = void (B::*)()]"
what_is_my_type<decltype(A::i)>(); // "void what_is_my_type() [T = int]"
what_is_my_type<decltype(B::i)>(); // "void what_is_my_type() [T = int]"
// what_is_my_type<decltype(B::f)>(); // doesn't compile
}
tôi đã đưa ra trong một chú thích sau mỗi cuộc gọi.
Ba cuộc gọi đầu tiên hoạt động như mong đợi - cả ba công việc và thông tin loại bao gồm loại cấu trúc (A
hoặc B
) cũng như loại thành viên.
Ba trường hợp sau cùng khác nhau. Người cuối cùng thậm chí không biên dịch, và người đầu tiên chỉ cần in int
. Tôi nghĩ đây là một đầu mối về những gì là sai. Có thể, cho một đặc biệt A
hoặc B
, để lấy địa chỉ của thành viên đó:
A a;
int * x = &(a.i);
*x = 32;
nhưng nó là không có thể (hoặc thậm chí có ý nghĩa?) Để làm điều này:
B b;
??? y = &(a.f); // what does this even mean?
Cuối cùng, để nhấn mạnh rằng đây không phải là về con trỏ, hãy xem xét điều này:
A a;
B b;
int x = a.i;
int y = b.i;
??? z = b.f; // what would this mean? What's its type?
Nguồn
2015-01-20 20:23:16
@Yakk Tôi đã thử nghiệm với g + + và xác nhận rằng không có trong số ba compi le, sau đó chỉnh sửa câu hỏi để sửa lỗi phủ định kép. –
Đưa '&' vào từ chúng khiến cho tất cả điều này hoạt động trên cả hai trình biên dịch, ví dụ: '& B :: i'. Nhưng, tôi đoán đó không phải là vấn đề! Tại sao họ không làm việc mà không có '&'? –
@MarkB Cảm ơn bạn đã sửa. Như bạn có thể thấy tôi không có lệnh đầy đủ của ngôn ngữ tiếng Anh. – Belloc