typeid(A::i).name()
不完全做我認爲會做的事。我期望它是一個指向成員的指針,但它實際上只是一個int
。
看到這一點,運行此代碼:
#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
}
我已經把輸出註釋每次通話後。
前三個調用按預期工作 - 所有三個工作和類型信息都包含結構類型(A
或B
)以及成員類型。
儘管最後三個不同。最後一個甚至沒有編譯,前兩個只是打印int
。我認爲這是線索問題。這是可能的,給予特定A
或B
,採取特定成員的地址:
A a;
int * x = &(a.i);
*x = 32;
但不可能(甚至是有意義的?)要做到這一點:
B b;
??? y = &(a.f); // what does this even mean?
最後,要強調這不是關於指針,請考慮這一點:
A a;
B b;
int x = a.i;
int y = b.i;
??? z = b.f; // what would this mean? What's its type?
@Yakk我用g ++進行測試,並確認沒有三個compi le,然後編輯這個問題來解決雙重否定。 – 2015-01-20 19:50:15
將'&'放入它們中會導致所有這些工作都在兩個編譯器上工作,例如, '&B :: i'。但是,我想這不是重點!爲什麼他們沒有'&'工作? – 2015-01-20 19:55:44
@MarkB感謝您的糾正。正如你所看到的,我沒有完全掌握英語。 – Belloc 2015-01-20 20:14:08