次のテストによると、これは:
std::cout << std::is_member_function_pointer<int A::*()>::value << std::endl;
メンバー関数ポインタではなく、通常の関数ですが、これは次のとおりです。
std::cout << std::is_member_function_pointer<int (A::*)()>::value << std::endl;
trueと評価されます。私はgccとmsvcの両方で試しました。これら2つの宣言の違いは何ですか?これらの結果は正しいですか?かっこがA::*
重要なのはなぜですか?
括弧で囲まれた型式の違いは、演算子の優先順位に起因します。
タイプのより詳細で説明的な仕様を取得する1つの方法は次のとおりです。
C:\ my \ forums \ so \ 120> echo struct A {}; T = int A :: *();を使用します。T o; int x = o; > 1.cpp C:\ my \ forums \ so \ 120> g ++ -c 1.cpp 1.cpp:1:48:エラー:「intA :: *(*)()」から「int」への変換が無効です[-fpermissive] struct A {}; T = int A :: *();を使用します。T o; int x = o; ^ C:\ my \ forums \ so \ 120> _
したがって、型の変数の型int A::*()
はint A::* (*)()
。であることがわかります。
編集:解決策としてマークされている間はこの投稿を削除できないため、記録のために:上記のコードでo
は変数ではありません。代わりに、それは関数宣言です。int A::*()
は直接関数型、つまりデータメンバーポインタを返す関数です。
今コーヒーに向かって…
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加