Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   C++11 Clause 12.7 paragraph 3 (http://www.velocityreviews.com/forums/t960294-c-11-clause-12-7-paragraph-3-a.html)

jabelloc@gmail.com 05-02-2013 02:29 PM

C++11 Clause 12.7 paragraph 3
 
1. What are the specific problems that are being avoided with the restrictions imposed by this clause `12.7p3` (see the first part of paragraph below)?

2. In the example shown in `12.7p3` (see below) why `X(this)` is considered defined? Is it because `X` is not in the path `E C D B A` ?

struct A { };
struct B : virtual A { };
struct C : B { };
struct D : virtual A { D(A*); };
struct X { X(A*); };
struct E : C, D, X {
E() : D(this), // undefined: upcast from E* to A*
// might use path E* - D* - A*
// but D is not constructed
// D((C*)this), // defined:
// E* - C* defined because E() has started
// and C* - A* defined because
// C fully constructed
X(this) { // defined: upon construction of X,
// C/B/D/A sublattice is fully constructed
}
};

3. Please find below the start of paragraph `12.7p3`:

> To explicitly or implicitly convert a pointer (a glvalue) referring to
> an object of class X to a pointer (reference) to a direct or indirect
> base class B of X, the construction of X and the construction of all
> of its direct or indirect bases that directly or indirectly derive
> from B shall have started and the destruction of these classes shall
> not have completed, otherwise the conversion results in undefined
> behavior.



Is it correct to say that the set of all direct and indirect bases of `X`, mentioned above don't include `B`, and because of this the code below is well defined, notwithstanding the fact that `Base` is a direct base of `Derived` and has yet not started?

struct Base{ Base(Base*); };

struct Derived : Base {
Derived() : Base(this) {};
};

Bo Persson 05-02-2013 05:15 PM

Re: C++11 Clause 12.7 paragraph 3
 
jabelloc@gmail.com skrev 2013-05-02 16:29:
> 1. What are the specific problems that are being avoided with the restrictions imposed by this clause `12.7p3` (see the first part of paragraph below)?
>
> 2. In the example shown in `12.7p3` (see below) why `X(this)` is considered defined? Is it because `X` is not in the path `E C D B A` ?
>
> struct A { };
> struct B : virtual A { };
> struct C : B { };
> struct D : virtual A { D(A*); };
> struct X { X(A*); };
> struct E : C, D, X {
> E() : D(this), // undefined: upcast from E* to A*
> // might use path E* - D* - A*
> // but D is not constructed
> // D((C*)this), // defined:
> // E* - C* defined because E() has started
> // and C* - A* defined because
> // C fully constructed
> X(this) { // defined: upon construction of X,
> // C/B/D/A sublattice is fully constructed
> }
> };
>
> 3. Please find below the start of paragraph `12.7p3`:
>
>> To explicitly or implicitly convert a pointer (a glvalue) referring to
>> an object of class X to a pointer (reference) to a direct or indirect
>> base class B of X, the construction of X and the construction of all
>> of its direct or indirect bases that directly or indirectly derive
>> from B shall have started and the destruction of these classes shall
>> not have completed, otherwise the conversion results in undefined
>> behavior.

>
>
> Is it correct to say that the set of all direct and indirect bases of `X`, mentioned above don't include `B`, and because of this the code below is well defined, notwithstanding the fact that `Base` is a direct base of `Derived` and has yet not started?
>
> struct Base{ Base(Base*); };
>
> struct Derived : Base {
> Derived() : Base(this) {};
> };
>


Yes.

The example is mostly about virtual inheritance and the problem is that
both C and D are derived from A, but there will still only be one A in a
complete E object.

Until both C and D are fully constructed, the compiler isn't required to
know how to get a pointer to the A base class of E (and even then it's
pretty complicated).

You don't have ANY of those problems.


Bo Persson



All times are GMT. The time now is 04:35 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.