Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #7534

Re: Slicing with ?: operator - expected?

From Victor Bazarov <v.bazarov@comcast.invalid>
Newsgroups comp.lang.c++
Subject Re: Slicing with ?: operator - expected?
Date 2011-07-06 11:37 -0400
Organization A noiseless patient Spider
Message-ID <iv1vf1$koa$1@dont-email.me> (permalink)
References <iv1p6s$acb$1@dont-email.me> <iv1s6f$pde$1@localhost.localdomain>

Show all headers | View raw


On 7/6/2011 10:41 AM, Bart van Ingen Schenau wrote:
> Victor Bazarov Wrote:
>
>> Hello All,
>>
>> Here is the code:
>>
>>      class Foo {
>>      public:
>>         virtual void bar() const = 0;
>>      };
>>
>>      #include<ostream>
>>      #include<iostream>
>>
>>      class Foo1 : public Foo {
>>         void bar() const { std::cout<<  "Foo1::bar\n"; }
>>      };
>>
>>      class Foo2 : public Foo {
>>         void bar() const { std::cout<<  "Foo2::bar\n"; }
>>      };
>>
>>      void foo(const Foo* pFoo)
>>      {
>>         (pFoo ? *pFoo : Foo1()).bar(); // line 19 ************
>>      }
>>
>>      void blah(const Foo&  rFoo)
>>      {
>>          foo(&rFoo);
>>      }
>>
>>      int main()
>>      {
>>         blah(Foo2());
>>      }
>>
>> Line 19 is the line in question.  Could you please interpret it for me?
>>    It seems to skip the virtual function dispatch, and attempt to call
>> the pure function.  The common type of *pFoo and Foo1() is 'class
>> Foo', and the compiler seems to resolve the 'bar' statically, without
>> the use of virtual function mechanism, as if there is an instance of
>> class Foo /sliced/ from both original objects.  Is that supposed to
>> happen?
>
> Yes, that is supposed to happen.
> The conditional operator (?:) is defined to only yield rvalues, and never a
> reference.

I don't think it's correct.  If both expressions after the '?' are 
lvalues of the same type, the resulting expression should be an lvalue. 
  Consider:

    int x, y; // zero-initialized
    int& getx() { return x; }
    int& gety() { return y; }

    void increment(int& i) { ++i; }

    int main(int argc, char **argv)
    {
       increment(argc % 2 ? getx() : gety());
    }

Or do you think it shouldn't compile?

> This means that objects of class-type indeed get sliced by the ?: operator.
>
>>
>> Standard chapter and verse would be helpful.
>
> The behaviour of the conditional operator is described in section 5.16
> [expr.cond], where especially the last paragraph is of relevance here.
>
>>
>> Thanks!
>>
>> V
>
> Bart v Ingen Schenau
>

V
-- 
I do not respond to top-posted replies, please don't ask

Back to comp.lang.c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Slicing with ?: operator - expected? Victor Bazarov <v.bazarov@comcast.invalid> - 2011-07-06 09:50 -0400
  Re: Slicing with ?: operator - expected? Michael DOUBEZ <michael.doubez@free.fr> - 2011-07-06 07:41 -0700
    Re: Slicing with ?: operator - expected? Michael DOUBEZ <michael.doubez@free.fr> - 2011-07-06 07:50 -0700
  Re: Slicing with ?: operator - expected? Bart van Ingen Schenau <bart@ingen.ddns.info> - 2011-07-06 16:41 +0200
    Re: Slicing with ?: operator - expected? Victor Bazarov <v.bazarov@comcast.invalid> - 2011-07-06 11:37 -0400
      Re: Slicing with ?: operator - expected? "Balog Pal" <pasa@lib.hu> - 2011-07-06 23:17 +0200
  Re: Slicing with ?: operator - expected? Joe Greer <jgreer@doubletake.com> - 2011-07-06 21:14 +0000
    Re: Slicing with ?: operator - expected? Victor Bazarov <v.bazarov@comcast.invalid> - 2011-07-08 15:56 -0400
      Re: Slicing with ?: operator - expected? Joe Greer <jgreer@doubletake.com> - 2011-07-11 16:35 +0000
        Re: Slicing with ?: operator - expected? Victor Bazarov <v.bazarov@comcast.invalid> - 2011-07-11 13:05 -0400
  Re: Slicing with ?: operator - expected? "Paul" <pchristor@yahoo.co.uk> - 2011-07-07 01:47 +0100

csiph-web