Date: Fri, 20 Jan 2023 08:32:56 +0100
On 2023-01-20 at 07:55, Julien Allali via Std-Proposals wrote:
> Hi everyone,
>
> I checked the following code from one of my student:
>
> class I{
> public:
> virtual ~I(){}
> virtual void print(){
> printf("hello %p\n",this);
> }
> virtual void f()=0;
> };
>
> class B : public virtual I{
> int i,j;
> public:
> ~B(){}
> virtual void f(){
> printf("B %p\n",this);
> }
> };
>
>
> void f(I *i){
> for(int j=0;j<5;++j)
> {
> i->print();
> i->f();
> printf("i=%p ",i);
> i++; // PROBLEM IS HERE
> printf(" => %p \n",i);
> }
> }
>
> int main(){
> B b[]={B(),B()};
> printf("B: %p %p\n",b,b+1);
> f(b);
> }
>
> As you can see, I is a non instantiable type as it has one pure virtual
> method. My concern is about the line "i++": I believed it will lead to
> an error or at least a warning (g++ 11.3.0)... Indeed, I can not imagine
> a valid case where doing arithmetic on a pointer of a type with pure
> virtual function can be valid.... Shouldn't the standard forbid such
> arithmetic?
>
Incrementing a pointer to a single element creates a one-past-the-end
pointer for the type. That is ok to *have*, but of course you cannot
dereference it.
> Hi everyone,
>
> I checked the following code from one of my student:
>
> class I{
> public:
> virtual ~I(){}
> virtual void print(){
> printf("hello %p\n",this);
> }
> virtual void f()=0;
> };
>
> class B : public virtual I{
> int i,j;
> public:
> ~B(){}
> virtual void f(){
> printf("B %p\n",this);
> }
> };
>
>
> void f(I *i){
> for(int j=0;j<5;++j)
> {
> i->print();
> i->f();
> printf("i=%p ",i);
> i++; // PROBLEM IS HERE
> printf(" => %p \n",i);
> }
> }
>
> int main(){
> B b[]={B(),B()};
> printf("B: %p %p\n",b,b+1);
> f(b);
> }
>
> As you can see, I is a non instantiable type as it has one pure virtual
> method. My concern is about the line "i++": I believed it will lead to
> an error or at least a warning (g++ 11.3.0)... Indeed, I can not imagine
> a valid case where doing arithmetic on a pointer of a type with pure
> virtual function can be valid.... Shouldn't the standard forbid such
> arithmetic?
>
Incrementing a pointer to a single element creates a one-past-the-end
pointer for the type. That is ok to *have*, but of course you cannot
dereference it.
Received on 2023-01-20 07:33:04