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?

How to write a nice frame challenge?

Math symbols in math operators

Synaptic Static - when to roll the d6?

How can the US president give an order to a civilian?

How can a warlock learn from a spellbook?

How to sort human readable size

Why things float in space, though there is always gravity of our star is present

Leaving job close to major deadlines

How do I find which software is doing an SSH connection?

What could be the physiological mechanism for a biological Geiger counter?

I have found ports on my Samsung smart tv running a display service. What can I do with it?

Do details of my undergraduate title matter?

Why was New Asgard established at this place?

Is Newton's third law really correct?

Why are there no file insertion syscalls

How to compute the inverse of an operation in Q#?

Are there any individual aliens that have gained superpowers in the Marvel universe?

How do you transpose samples in cents?

Why there is a red color in right side?

What mathematical theory is required for high frequency trading?

Why do you need to heat the pan before heating the olive oil?

What kind of chart is this?

How "fast" do astronomical events occur?

Does there exist a non-trivial group that is both perfect and complete?



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 height:90px;width:728px;box-sizing:border-box;








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 1 hour ago









      Fabio Turati

      2,75652542




      2,75652542










      asked 11 hours ago









      AlexanderAlexander

      985414




      985414






















          1 Answer
          1






          active

          oldest

          votes


















          7














          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

























          • 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
            11 hours ago











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

            – Alexander
            11 hours ago







          • 1





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

            – StoryTeller
            11 hours ago











          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









          7














          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

























          • 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
            11 hours ago











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

            – Alexander
            11 hours ago







          • 1





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

            – StoryTeller
            11 hours ago















          7














          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

























          • 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
            11 hours ago











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

            – Alexander
            11 hours ago







          • 1





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

            – StoryTeller
            11 hours ago













          7












          7








          7







          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 11 hours ago

























          answered 11 hours ago









          StoryTellerStoryTeller

          112k17236303




          112k17236303












          • 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
            11 hours ago











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

            – Alexander
            11 hours ago







          • 1





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

            – StoryTeller
            11 hours ago

















          • 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
            11 hours ago











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

            – Alexander
            11 hours ago







          • 1





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

            – StoryTeller
            11 hours ago
















          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
          11 hours ago





          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
          11 hours ago













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

          – Alexander
          11 hours ago






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

          – Alexander
          11 hours ago





          1




          1





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

          – StoryTeller
          11 hours ago





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

          – StoryTeller
          11 hours ago



















          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

          Sahara Skak | Bilen | Luke uk diar | NawigatsjuunCommonskategorii: SaharaWikivoyage raisfeerer: Sahara26° N, 13° O

          The fall designs the understood secretary. Looking glass Science Shock Discovery Hot Everybody Loves Raymond Smile 곳 서비스 성실하다 Defas Kaloolon Definition: To combine or impregnate with sulphur or any of its compounds as to sulphurize caoutchouc in vulcanizing Flame colored Reason Useful Thin Help 갖다 유명하다 낙엽 장례식 Country Iron Definition: A fencer a gladiator one who exhibits his skill in the use of the sword Definition: The American black throated bunting Spiza Americana Nostalgic Needy Method to my madness 시키다 평가되다 전부 소설가 우아하다 Argument Tin Feeling Representative Gym Music Gaur Chicken 일쑤 코치 편 학생증 The harbor values the sugar. Vasagle Yammoe Enstatite Definition: Capable of being limited Road Neighborly Five Refer Built Kangaroo 비비다 Degree Release Bargain Horse 하루 형님 유교 석 동부 괴롭히다 경제력

          19. јануар Садржај Догађаји Рођења Смрти Празници и дани сећања Види још Референце Мени за навигацијуу