How would you explain this difference in pointer to members of base and derived class using standard quotes?How to call a parent class function from derived class function?Pointer to class data member “::*”Purpose of Unions in C and C++Pretty-print C++ STL containersEfficient unsigned-to-signed cast avoiding implementation-defined behaviorWhy is f(i = -1, i = -1) undefined behavior?Why does the C++ linker allow undefined functions?restrict a template function, to only allow certain typesConverting a pointer-to-member-of-base to a pointer-to-member-of-derivedDoes the C++ standard allow for an uninitialized bool to crash a program?

Why does adding parentheses prevent an error?

STM Microcontroller burns every time

Why would people reject a god's purely beneficial blessing?

Was is the difference between "uparujjhati" & "nirujjhati"?

Would a two-seat light aircaft with a landing speed of 20 knots and a top speed of 180 knots be technically possible?

How many codes are possible?

Firefox Arm64 available but RapsPi 3B+ still 32 bit

What is this particular type of chord progression, common in classical music, called?

Are there any vegetarian astronauts?

How dangerous are set-size assumptions?

What is the line crossing the Pacific Ocean that is shown on maps?

How to append a matrix element by element?

What are the penalties for overstaying in USA?

Is there any reason to avoid sunglasses with blue lenses?

Is my Rep in Stack-Exchange Form?

Can a US President have someone sent to prison?

Fedora boot screen shows both Fedora logo and Lenovo logo. Why and How?

How to determine what is the correct level of detail when modelling?

Why does the numerical solution of an ODE move away from an unstable equilibrium?

Why is C++ initial allocation so much larger than C's?

Swapping rooks in a 4x4 board

What's the difference between 予定 (Yotei) and 計画 (keikaku)?

How can Charles Proxy change settings without admin rights after first time?

Counting occurrence of words in table is slow



How would you explain this difference in pointer to members of base and derived class using standard quotes?


How to call a parent class function from derived class function?Pointer to class data member “::*”Purpose of Unions in C and C++Pretty-print C++ STL containersEfficient unsigned-to-signed cast avoiding implementation-defined behaviorWhy is f(i = -1, i = -1) undefined behavior?Why does the C++ linker allow undefined functions?restrict a template function, to only allow certain typesConverting a pointer-to-member-of-base to a pointer-to-member-of-derivedDoes the C++ standard allow for an uninitialized bool to crash a program?






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








7















demo:



#include<iostream>
struct A int i = 10; ;
struct B : A ;

int main()
std::cout << "decltype(&B::i) == int A::* ? " << std::boolalpha
<< std::is_same<decltype(&B::i), int A::*>::value << 'n'; //#1
A a;
std::cout << a.*(&A::i) << 'n';

std::cout << "decltype(&B::i) == int B::* ? "
<< std::is_same<decltype(&B::i), int B::*>::value << 'n'; //#2
B b;
std::cout << b.*(&B::i) << 'n';



The code prints



decltype(&B::i) == int A::* ? true
10
decltype(&B::i) == int B::* ? false
10


I used the example in [expr.unary.op]/3, where the standard says that the type of &B::i is int A::*, but that is not normative.










share|improve this question






























    7















    demo:



    #include<iostream>
    struct A int i = 10; ;
    struct B : A ;

    int main()
    std::cout << "decltype(&B::i) == int A::* ? " << std::boolalpha
    << std::is_same<decltype(&B::i), int A::*>::value << 'n'; //#1
    A a;
    std::cout << a.*(&A::i) << 'n';

    std::cout << "decltype(&B::i) == int B::* ? "
    << std::is_same<decltype(&B::i), int B::*>::value << 'n'; //#2
    B b;
    std::cout << b.*(&B::i) << 'n';



    The code prints



    decltype(&B::i) == int A::* ? true
    10
    decltype(&B::i) == int B::* ? false
    10


    I used the example in [expr.unary.op]/3, where the standard says that the type of &B::i is int A::*, but that is not normative.










    share|improve this question


























      7












      7








      7








      demo:



      #include<iostream>
      struct A int i = 10; ;
      struct B : A ;

      int main()
      std::cout << "decltype(&B::i) == int A::* ? " << std::boolalpha
      << std::is_same<decltype(&B::i), int A::*>::value << 'n'; //#1
      A a;
      std::cout << a.*(&A::i) << 'n';

      std::cout << "decltype(&B::i) == int B::* ? "
      << std::is_same<decltype(&B::i), int B::*>::value << 'n'; //#2
      B b;
      std::cout << b.*(&B::i) << 'n';



      The code prints



      decltype(&B::i) == int A::* ? true
      10
      decltype(&B::i) == int B::* ? false
      10


      I used the example in [expr.unary.op]/3, where the standard says that the type of &B::i is int A::*, but that is not normative.










      share|improve this question
















      demo:



      #include<iostream>
      struct A int i = 10; ;
      struct B : A ;

      int main()
      std::cout << "decltype(&B::i) == int A::* ? " << std::boolalpha
      << std::is_same<decltype(&B::i), int A::*>::value << 'n'; //#1
      A a;
      std::cout << a.*(&A::i) << 'n';

      std::cout << "decltype(&B::i) == int B::* ? "
      << std::is_same<decltype(&B::i), int B::*>::value << 'n'; //#2
      B b;
      std::cout << b.*(&B::i) << 'n';



      The code prints



      decltype(&B::i) == int A::* ? true
      10
      decltype(&B::i) == int B::* ? false
      10


      I used the example in [expr.unary.op]/3, where the standard says that the type of &B::i is int A::*, but that is not normative.







      c++ language-lawyer pointer-to-member






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jun 17 at 0:24









      Fabio Turati

      2,7975 gold badges25 silver badges42 bronze badges




      2,7975 gold badges25 silver badges42 bronze badges










      asked Jun 16 at 13:36









      AlexanderAlexander

      9854 silver badges14 bronze badges




      9854 silver badges14 bronze badges






















          1 Answer
          1






          active

          oldest

          votes


















          8














          From the paragraph you link to, emphasis mine:




          If the operand is a qualified-id naming a non-static or variant member
          m of some class C with type T, the result has type “pointer to member
          of class C of type T” and is a prvalue designating C::m.




          "Some class C" means it need not be the same class as the one mentioned by the qualified-id. In this case, i is a member of A, and remains a member of A even when named by &B::i. The type of &B::i is therefore int A::*, which you can verify by the test



          std::is_same<decltype(&B::i), int A::*>::value


          According to [class.qual]/1, member lookup follows the algorithm detailed in [class.member.lookup]. It is according to the rules there, which inspect the sub-object from which the member i comes from, that the class C is determined. Since i is a member of the sub-object A, the class of the pointer to member is determined to be A.






          share|improve this answer




















          • 1





            To add some additional commentary: This follows on from the way that a pointer-to-member-of-base can be implicitly converted to pointer-to-member-of-derived (in contrast to the way that pointer-to-derived can be implicitly converted to pointer-to-base).

            – Martin Bonner
            Jun 16 at 13:55











          • I'm not convinced by your conclusion: "Some class C means .... The type of &B::i is therefore int A::*.

            – Alexander
            Jun 16 at 14:18







          • 1





            @Alexander - My conclusion is backed by the member lookup algorithm. And the wording of "some class" is not coincidental.

            – StoryTeller
            Jun 16 at 14:20













          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "1"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f56619345%2fhow-would-you-explain-this-difference-in-pointer-to-members-of-base-and-derived%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          8














          From the paragraph you link to, emphasis mine:




          If the operand is a qualified-id naming a non-static or variant member
          m of some class C with type T, the result has type “pointer to member
          of class C of type T” and is a prvalue designating C::m.




          "Some class C" means it need not be the same class as the one mentioned by the qualified-id. In this case, i is a member of A, and remains a member of A even when named by &B::i. The type of &B::i is therefore int A::*, which you can verify by the test



          std::is_same<decltype(&B::i), int A::*>::value


          According to [class.qual]/1, member lookup follows the algorithm detailed in [class.member.lookup]. It is according to the rules there, which inspect the sub-object from which the member i comes from, that the class C is determined. Since i is a member of the sub-object A, the class of the pointer to member is determined to be A.






          share|improve this answer




















          • 1





            To add some additional commentary: This follows on from the way that a pointer-to-member-of-base can be implicitly converted to pointer-to-member-of-derived (in contrast to the way that pointer-to-derived can be implicitly converted to pointer-to-base).

            – Martin Bonner
            Jun 16 at 13:55











          • I'm not convinced by your conclusion: "Some class C means .... The type of &B::i is therefore int A::*.

            – Alexander
            Jun 16 at 14:18







          • 1





            @Alexander - My conclusion is backed by the member lookup algorithm. And the wording of "some class" is not coincidental.

            – StoryTeller
            Jun 16 at 14:20















          8














          From the paragraph you link to, emphasis mine:




          If the operand is a qualified-id naming a non-static or variant member
          m of some class C with type T, the result has type “pointer to member
          of class C of type T” and is a prvalue designating C::m.




          "Some class C" means it need not be the same class as the one mentioned by the qualified-id. In this case, i is a member of A, and remains a member of A even when named by &B::i. The type of &B::i is therefore int A::*, which you can verify by the test



          std::is_same<decltype(&B::i), int A::*>::value


          According to [class.qual]/1, member lookup follows the algorithm detailed in [class.member.lookup]. It is according to the rules there, which inspect the sub-object from which the member i comes from, that the class C is determined. Since i is a member of the sub-object A, the class of the pointer to member is determined to be A.






          share|improve this answer




















          • 1





            To add some additional commentary: This follows on from the way that a pointer-to-member-of-base can be implicitly converted to pointer-to-member-of-derived (in contrast to the way that pointer-to-derived can be implicitly converted to pointer-to-base).

            – Martin Bonner
            Jun 16 at 13:55











          • I'm not convinced by your conclusion: "Some class C means .... The type of &B::i is therefore int A::*.

            – Alexander
            Jun 16 at 14:18







          • 1





            @Alexander - My conclusion is backed by the member lookup algorithm. And the wording of "some class" is not coincidental.

            – StoryTeller
            Jun 16 at 14:20













          8












          8








          8







          From the paragraph you link to, emphasis mine:




          If the operand is a qualified-id naming a non-static or variant member
          m of some class C with type T, the result has type “pointer to member
          of class C of type T” and is a prvalue designating C::m.




          "Some class C" means it need not be the same class as the one mentioned by the qualified-id. In this case, i is a member of A, and remains a member of A even when named by &B::i. The type of &B::i is therefore int A::*, which you can verify by the test



          std::is_same<decltype(&B::i), int A::*>::value


          According to [class.qual]/1, member lookup follows the algorithm detailed in [class.member.lookup]. It is according to the rules there, which inspect the sub-object from which the member i comes from, that the class C is determined. Since i is a member of the sub-object A, the class of the pointer to member is determined to be A.






          share|improve this answer















          From the paragraph you link to, emphasis mine:




          If the operand is a qualified-id naming a non-static or variant member
          m of some class C with type T, the result has type “pointer to member
          of class C of type T” and is a prvalue designating C::m.




          "Some class C" means it need not be the same class as the one mentioned by the qualified-id. In this case, i is a member of A, and remains a member of A even when named by &B::i. The type of &B::i is therefore int A::*, which you can verify by the test



          std::is_same<decltype(&B::i), int A::*>::value


          According to [class.qual]/1, member lookup follows the algorithm detailed in [class.member.lookup]. It is according to the rules there, which inspect the sub-object from which the member i comes from, that the class C is determined. Since i is a member of the sub-object A, the class of the pointer to member is determined to be A.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Jun 16 at 13:49

























          answered Jun 16 at 13:42









          StoryTellerStoryTeller

          112k18 gold badges239 silver badges303 bronze badges




          112k18 gold badges239 silver badges303 bronze badges







          • 1





            To add some additional commentary: This follows on from the way that a pointer-to-member-of-base can be implicitly converted to pointer-to-member-of-derived (in contrast to the way that pointer-to-derived can be implicitly converted to pointer-to-base).

            – Martin Bonner
            Jun 16 at 13:55











          • I'm not convinced by your conclusion: "Some class C means .... The type of &B::i is therefore int A::*.

            – Alexander
            Jun 16 at 14:18







          • 1





            @Alexander - My conclusion is backed by the member lookup algorithm. And the wording of "some class" is not coincidental.

            – StoryTeller
            Jun 16 at 14:20












          • 1





            To add some additional commentary: This follows on from the way that a pointer-to-member-of-base can be implicitly converted to pointer-to-member-of-derived (in contrast to the way that pointer-to-derived can be implicitly converted to pointer-to-base).

            – Martin Bonner
            Jun 16 at 13:55











          • I'm not convinced by your conclusion: "Some class C means .... The type of &B::i is therefore int A::*.

            – Alexander
            Jun 16 at 14:18







          • 1





            @Alexander - My conclusion is backed by the member lookup algorithm. And the wording of "some class" is not coincidental.

            – StoryTeller
            Jun 16 at 14:20







          1




          1





          To add some additional commentary: This follows on from the way that a pointer-to-member-of-base can be implicitly converted to pointer-to-member-of-derived (in contrast to the way that pointer-to-derived can be implicitly converted to pointer-to-base).

          – Martin Bonner
          Jun 16 at 13:55





          To add some additional commentary: This follows on from the way that a pointer-to-member-of-base can be implicitly converted to pointer-to-member-of-derived (in contrast to the way that pointer-to-derived can be implicitly converted to pointer-to-base).

          – Martin Bonner
          Jun 16 at 13:55













          I'm not convinced by your conclusion: "Some class C means .... The type of &B::i is therefore int A::*.

          – Alexander
          Jun 16 at 14:18






          I'm not convinced by your conclusion: "Some class C means .... The type of &B::i is therefore int A::*.

          – Alexander
          Jun 16 at 14:18





          1




          1





          @Alexander - My conclusion is backed by the member lookup algorithm. And the wording of "some class" is not coincidental.

          – StoryTeller
          Jun 16 at 14:20





          @Alexander - My conclusion is backed by the member lookup algorithm. And the wording of "some class" is not coincidental.

          – StoryTeller
          Jun 16 at 14:20



















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f56619345%2fhow-would-you-explain-this-difference-in-pointer-to-members-of-base-and-derived%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Grendel Contents Story Scholarship Depictions Notes References Navigation menu10.1093/notesj/gjn112Berserkeree

          Area configuration aggregation error after install Porto themeMagento 2.1 CE Installed but front/backend not loading/workingCSS not loading on page within Magento 2 pageCannot install module in Magento 2no commands defined in the “setup” namespace. in Magento2Magento 2: Static files are present but shows 404Why do i have to always run the commands to clean cache in Magento 2.1.8?Failure reason: 'Unable to unserialize value.'Error 500 after magento migrationIn production mode the site does not loadMagento 2 : Error 500 after installing

          Middle Expansion Olielle Resaix Definition: Uttering songs of triumph shouting with joy triumphant exulting Sejunction Journal 붙다 달 고급 품목 외출 The stretch trades the screeching tin. Definition: The act of speaking with a drawl a drawl Cough Sand Definition: An uproar a quarrel a noisy outbreak Shake Iron Publicize Horse House Baby 사과 Resaix Flaggy Jelly Temporary Unequaled Puppet A drop in the bucket Shrew 성격 회원 성질 미팅 The burn frames the tacky quality. Materialistic The smoke reduces the way. Yammoe Nondescript Cheek 얼굴 배 약하다 날리다 타다 The illegal country shows the iron. Help Rule Drearien Smoke Teaching Meaty Wasp Abraham Lincoln Jaws 진심 수리하다 Size Cork Idea Convert Think Lark John Lennon 거울 청소 군 추천하다 아이스크림