220 23397 <4a61195c-a3b8-446f-9d36-5dcc7287c24a@isocpp.org> article
Path: news.gmane.org!not-for-mail
From: Dejan Milosavljevic <dmilos@gmail.com>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Dynamic/Temporal constatization
Date: Sat, 2 Jan 2016 06:08:25 -0800 (PST)
Lines: 356
Approved: news@gmane.org
Message-ID: <4a61195c-a3b8-446f-9d36-5dcc7287c24a@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: plane.gmane.org
Mime-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_0_1484563950.1451743705442"
X-Trace: ger.gmane.org 1451743711 22729 80.91.229.3 (2 Jan 2016 14:08:31 GMT)
X-Complaints-To: usenet@ger.gmane.org
NNTP-Posting-Date: Sat, 2 Jan 2016 14:08:31 +0000 (UTC)
To: ISO C++ Standard - Future Proposals <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBDFYFDOFWUGBBWVTT62AKGQEPEXAGCY@isocpp.org Sat Jan 02 15:08:30 2016
Return-path: <std-proposals+bncBDFYFDOFWUGBBWVTT62AKGQEPEXAGCY@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-ob0-f200.google.com ([209.85.214.200])
	by plane.gmane.org with esmtp (Exim 4.69)
	(envelope-from <std-proposals+bncBDFYFDOFWUGBBWVTT62AKGQEPEXAGCY@isocpp.org>)
	id 1aFMr7-0005xE-5C
	for gclcip-std-proposals@m.gmane.org; Sat, 02 Jan 2016 15:08:29 +0100
Original-Received: by mail-ob0-f200.google.com with SMTP id or18sf632750816obb.2
        for <gclcip-std-proposals@m.gmane.org>; Sat, 02 Jan 2016 06:08:28 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=date:from:to:message-id:subject:mime-version:content-type
         :x-original-sender:reply-to:precedence:mailing-list:list-id
         :x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=FwxYngvF1me95fkCoU5m/5NzbZ+ELVX3yu1y8+O7Nro=;
        b=eaQCLEPIYxnqEMOb2qLVQ8brhAbK7mBJWZC9BFGEuTSphVYxu6+5ZxOjZuUL9r99dn
         9M9J1ugGTS8uMOcKk1gF6TyQ5jWVCd3rkaWb0JcYXnLfjn4EbMDp1UXEMhHjajfMVOV0
         6obID5rnufUJBj0AikjP7SC+y0GKALA3wlvFo/OPOYkPMB8L8Q8qWkniMvvbLavfN2Dh
         f/0MtY9PfXjau2EFq12EmQFQwyCs5oRYXBQCevrrgmZQaPzXEHL7Exa4DUVCI4YzqRaw
         TMfodF1Y/DGEz7amyR1z6IgISCxdMYkbibqFNw8CHOWcNgD80AqYIlq5Z8YvYpat960Y
         aCww==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20120113;
        h=date:from:to:message-id:subject:mime-version:content-type
         :x-original-sender:reply-to:precedence:mailing-list:list-id
         :x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=FwxYngvF1me95fkCoU5m/5NzbZ+ELVX3yu1y8+O7Nro=;
        b=V47bsGYVZKeFzh6+BF6Ar7EmvwWBORrtI4e2KCmv1yuYVIFiQwKSB1KdpBQoMrldt4
         38O/PF1mWebI3J37v49zdvdgPYxOU4TT4SynpXwHlWLPpsHL4BqRu2vMbr/6nE3Bhjxp
         y4l4DcwQOtVAMAv1gVqfdUdQ8OqYxxY51x3dAKNjFtzwWgXoU9hTziNGSIyC5039tjub
         Mal7QdX9yJNmsoeBYYEx9yWP7zUkkxfS4Y21bvzo4FduOYbOayd6bHohuKeZlCBBLSs6
         6eNq/L5GxDNIc1W5yUM8YeFzjvSOu1VKoCXKXAuDuFIb0myfbODetpIZsvjysX14PZ3S
         4tLQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20130820;
        h=x-gm-message-state:date:from:to:message-id:subject:mime-version
         :content-type:x-original-sender:reply-to:precedence:mailing-list
         :list-id:x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=FwxYngvF1me95fkCoU5m/5NzbZ+ELVX3yu1y8+O7Nro=;
        b=C37qrZxWbb6wVVXi8YJ/hw6H/iqH55k7md3aNaTEDjJiBe5CLJnSKrl/xoCiUYB1Yc
         T5PIse8N4CrfhGGwLlUnR12Vu/pTsLf5oYhLJIv0QjuBxzKCJTJC/WYh+7xeArzmliQT
         YvkWqXCinCOyRGtaNcEayiOK3MyVNf4ojlGA4lEW0mvE9ddSutDUibhtqPbBachCMSIk
         mXkEW1osEBaMia86tZ31HskkfodxlOVYMqWAfMzHiOcjRaljTDHHyzBcx04Hj4YS6abb
         K3u4aL2HDh/AZL9wvAH+XA3EGFAh3cvc+ueCunb7qgbeorfk9BCfvBaoSn/s5l3rrTfr
         12MA==
X-Gm-Message-State: ALoCoQnkEAjDj43na1gL/4+lAyQAApWZjS1fp5RFGGMJjo8Zi0XjLZHhNrQNvPt26qAtNIWEhKcZ6U6dLKPMVY8nGKBXWgg66A==
X-Received: by 10.182.96.136 with SMTP id ds8mr22465553obb.17.1451743707932;
        Sat, 02 Jan 2016 06:08:27 -0800 (PST)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.107.18.137 with SMTP id 9ls2953918ios.106.gmail; Sat, 02 Jan
 2016 06:08:26 -0800 (PST)
X-Received: by 10.50.57.100 with SMTP id h4mr1173568igq.6.1451743706380;
        Sat, 02 Jan 2016 06:08:26 -0800 (PST)
X-Original-Sender: dmilos@gmail.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <https://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <https://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <https://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:23397
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/23397>

------=_Part_0_1484563950.1451743705442
Content-Type: multipart/alternative; 
	boundary="----=_Part_1_1827313706.1451743705447"

------=_Part_1_1827313706.1451743705447
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

=20

Hi

Idea is simple. Make instance temporally constant.
=20
Small example:
    Container<int> c;=20
    func( *const*( c ) );=20
    *const*( c ).f();
=20
=20
And in details:
 =20
=20
Table of Contents.

   - I. Abstract
   - II. Motivation
   - III. Solution
   - IV. Syntax
   - V. Summary
   - VI. Impact On the Standard
  =20
I. Abstract
Dynamic constatization of instances.=20
II. Motivation
Problem 1:[*Example*:=20

template< typename T>
 class Container{
   public:
     typedef T* iterator;
     typedef T const* const_iterator;
     iterator begin();
     const_iterator begin()const;
     iterator end();
     const_iterator end()const;
     void f();
     void f()const;
  };

  Container<int> cont;

  for( auto const & iter : cont ){ // in here we want to be called *begin()=
const* and *end()const*
  }

=E2=80=94*end example*]
=20
Problem 2:
[*Example*:=20

   void func( Container<int> & c );
   void func( Container<int> const & c );

   void do_something(){
    Container<int> cont;

    func(cont); // In here we want to call func( Container<int> const& c );
   }

=E2=80=94*end example*]=20
=20

III. Solution
Solutions within current standard=20
  =20
   - Bloat code with new functions that has different name which will serve=
=20
   to only to only one purpose.
   Examples are: vector::cbegin and vector::cend, vector::crbegin,=20
   vector::crend.=20
   - Use helper variable with const qualifier.
   =20
   [*Example*:=20
  =20
     {
      Container<int> const& ccont =3D cont;
      for( auto & iter : cont ){
      }
     }
  =20
   =E2=80=94*end example*]=20
   - Use some of existing cast operator which will directly lead to=20
   misunderstanding and possible to something more serious.=20
   [*Example*:=20
  =20
     // Some companies might forbid usage of reinterpret_cast
     for( auto const & iter : reinterpret_cast< Container<int> const& >( co=
nt ) ){
       // ... ... ...
     }
  =20
     for( auto const & iter : static_cast< Container<int> const& >( cont ) =
){
       // ... ... ...
     }
     // it is expected that const_cast remove constness not to add
     for( auto const & iter : const_cast< Container<int> const& >( cont ) )=
{
       // ... ... ...
     }
  =20
     for( auto const & iter : ( Container<int> const& )( cont ) ){
         // ... ... ...
     }
    =20
  =20
   =E2=80=94*end example*]
   =20
   In all cases code become less readable if we have type with realy long=
=20
   name e.g. std::map< std::string, std::pair< std::string, std::string > >=
..=20
  =20
  =20
By adding ability to const to act on instances.On range loop:
[*Example*:=20

Container<int> cont;
for( auto &iter : const( cont ) ){
 // ...
 }

=E2=80=94*end example*]=20
=20
On instance:
[*Example*:=20

Container<int> cont;

func( const( cont ) );

const( cont ).f();


=E2=80=94*end example*]=20
=20
On pointers:
[*Example*:=20

Container<int> cont;

Container<int> * cp1 =3D &cont;
const( cp1 )->f();
Container<int> *const cp2 =3D &cont;
const( cp2 )->f();
Container<int> const* cp3 =3D &cont;
const( cp3 )->f();

=E2=80=94*end example*]=20

IV. Syntax*const-operator:*const ( *expression* )

V. Summary

   - Avoid code bloat by adding functions which to allow explicit call of=
=20
   const functions.
   - Avoid misusing of cast operators to add temporal constness.
   - Avoid using of temporal const references.

VI. Impact On the Standard
  Core
    No effect.
    No new keywords.=20
    No new tokens.=20
    No changes to old syntax.=20
    Pure extension.=20
    Backward compatible.=20
  Library
    No effect.
  Existing code.
    No effect.

--=20

---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at https://groups.google.com/a/isocpp.org/group/std-propos=
als/.

------=_Part_1_1827313706.1451743705447
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div class=3D"NaslovGlavni"><div>=C2=A0</div></div><div cl=
ass=3D"NaslovGlavni"><br></div><div class=3D"NaslovGlavni">Hi</div><div cla=
ss=3D"NaslovGlavni"><br></div><div class=3D"NaslovGlavni">Idea is simple. M=
ake instance temporally constant.</div><div class=3D"NaslovGlavni"><div>=C2=
=A0</div></div><div class=3D"NaslovGlavni">Small example:</div><div class=
=3D"NaslovGlavni"></div><div class=3D"NaslovGlavni"><font face=3D"courier n=
ew,monospace">=C2=A0=C2=A0=C2=A0 Container&lt;int&gt; c;=C2=A0<div>=C2=A0=
=C2=A0=C2=A0 func( <em>const</em>( c ) );=C2=A0</div><div>=C2=A0=C2=A0=C2=
=A0 <em>const</em>( c ).f();</div></font><div><font face=3D"courier new,mon=
ospace"></font>=C2=A0</div><div>=C2=A0</div><div>And in details:</div></div=
><div class=3D"NaslovGlavni"><div>=C2=A0=C2=A0</div></div><dt><div class=3D=
"NaslovGlavni"><div>=C2=A0</div></div></dt><dt><div class=3D"NaslovGlavni">=
Table of Contents.</div></dt><dd><ul><li><div class=3D"TOCItem">I. Abstract=
</div></li><li><div class=3D"TOCItem">II. Motivation</div></li><li><div cla=
ss=3D"TOCItem">III. Solution</div></li><li><div class=3D"TOCItem">IV. Synta=
x</div></li><li><div class=3D"TOCItem">V. Summary</div></li><li><div class=
=3D"TOCItem">VI. Impact On the Standard</div></li></ul></dd><dt><div class=
=3D"NaslovGlavni">I. Abstract</div></dt><dd>    Dynamic constatization of i=
nstances.    </dd><dt><div class=3D"NaslovGlavni">II. Motivation</div></dt>=
<dd><dl><dt>Problem 1:</dt><dd>[<i>Example</i>: <code><pre class=3D"TextCod=
e">template&lt; typename T&gt;
 class Container{
   public:
     typedef T* iterator;
     typedef T const* const_iterator;
     iterator begin();
     const_iterator begin()const;
     iterator end();
     const_iterator end()const;
     void f();
     void f()const;
  };

  Container&lt;int&gt; cont;

  for( auto const &amp; iter : cont ){ // in here we want to be called <i>b=
egin()const</i> and <i>end()const</i>
  }
</pre></code><font face=3D"Times New Roman">     =E2=80=94<i>end example</i=
>]<div>=C2=A0</div></font><div>Problem 2:</div></dd></dl><dl><dd>    [<i>Ex=
ample</i>: <code><pre class=3D"TextCode">   void func( Container&lt;int&gt;=
 &amp; c );
   void func( Container&lt;int&gt; const &amp; c );

   void do_something(){
    Container&lt;int&gt; cont;

    func(cont); // In here we want to call func( Container&lt;int&gt; const=
&amp; c );
   }</pre></code><font face=3D"Times New Roman">=E2=80=94<i>end example</i>=
] </font><div><font face=3D"Times New Roman"></font>=C2=A0</div></dd></dl><=
p class=3D"NovaStranica"></p></dd><dt><div class=3D"NaslovGlavni">III. Solu=
tion</div></dt><dd><dl><dt class=3D"Naslovcic">Solutions within current sta=
ndard </dt><dd><ul><li>Bloat code with new functions that has different nam=
e which will serve to only to only one purpose.<div>            Examples ar=
e: <code>vector::cbegin</code> and <code>vector::cend</code>, <code>vector:=
:crbegin</code>, <code>vector::crend</code>.         </div></li><li>Use hel=
per variable with <code>const</code> qualifier.<div>=C2=A0</div><div>[<i>Ex=
ample</i>: <code></code></div><pre class=3D"TextCode"><code>  {
   Container&lt;int&gt; const&amp; ccont =3D cont;
   for( auto &amp; iter : cont ){
   }
  }
</code></pre><font face=3D"Times New Roman">=E2=80=94<i>end example</i>]   =
      </font></li><li>        Use some of existing cast operator which will=
 directly lead to misunderstanding and possible to something more serious. =
<div>[<i>Example</i>: <code></code></div><pre class=3D"TextCode"><code>  //=
 Some companies might forbid usage of reinterpret_cast
  for( auto const &amp; iter : reinterpret_cast&lt; Container&lt;int&gt; co=
nst&amp; &gt;( cont ) ){
    // ... ... ...
  }

  for( auto const &amp; iter : static_cast&lt; Container&lt;int&gt; const&a=
mp; &gt;( cont ) ){
    // ... ... ...
  }
  // it is expected that const_cast remove constness not to add
  for( auto const &amp; iter : const_cast&lt; Container&lt;int&gt; const&am=
p; &gt;( cont ) ){
    // ... ... ...
  }

  for( auto const &amp; iter : ( Container&lt;int&gt; const&amp; )( cont ) =
){
      // ... ... ...
  }
 =20
</code></pre><font face=3D"Times New Roman"> =E2=80=94<i>end example</i>]<d=
iv>=C2=A0</div></font><div><font face=3D"Times New Roman">  In all cases co=
de become less readable if we have type with realy long name e.g. </font><c=
ode>std::map&lt; std::string, std::pair&lt; std::string, std::string &gt; &=
gt;</code><font face=3D"Times New Roman">.       </font></div></li></ul></d=
d><dt class=3D"Naslovcic">By adding ability to <code>const</code> to act on=
 instances.</dt><dd>On range loop:<div> [<i>Example</i>: </div><blockquote>=
<code><pre class=3D"TextCode">Container&lt;int&gt; cont;
for( auto &amp;iter : const( cont ) ){
 // ...
 }
</pre></code><font face=3D"Times New Roman"> </font></blockquote>=E2=80=94<=
i>end example</i>] <div>=C2=A0</div><div> On instance:</div><div> [<i>Examp=
le</i>: </div><blockquote><code><pre class=3D"TextCode">Container&lt;int&gt=
; cont;

func( const( cont ) );

const( cont ).f();

</pre></code><font face=3D"Times New Roman"> </font></blockquote>=E2=80=94<=
i>end example</i>] <div>=C2=A0</div><div> On pointers:</div><div> [<i>Examp=
le</i>: </div><blockquote><code><pre class=3D"TextCode">Container&lt;int&gt=
; cont;

Container&lt;int&gt; * cp1 =3D &amp;cont;
const( cp1 )-&gt;f();
Container&lt;int&gt; *const cp2 =3D &amp;cont;
const( cp2 )-&gt;f();
Container&lt;int&gt; const* cp3 =3D &amp;cont;
const( cp3 )-&gt;f();
</pre></code><font face=3D"Times New Roman"> </font></blockquote>=E2=80=94<=
i>end example</i>]    </dd></dl><p class=3D"NovaStranica"></p></dd><dt clas=
s=3D"NaslovGlavni">IV. Syntax</dt><dd><dl><dt><i>const-operator:</i></dt><d=
d><code>const</code> ( <i>expression</i> )</dd></dl><p class=3D"NovaStranic=
a"></p></dd><dt><div class=3D"NaslovGlavni">V. Summary</div></dt><dd><ul><l=
i>Avoid code bloat by adding functions which to allow explicit call of <cod=
e>const</code> functions.</li><li>Avoid misusing of cast operators to add t=
emporal <code>const</code>ness.</li><li>Avoid using of temporal <code>const=
</code> references.</li></ul><dl></dl></dd><dt><div class=3D"NaslovGlavni">=
VI. Impact On the Standard</div></dt><dd><dl><dt><div class=3D"NaslovPod ">=
=C2=A0 Core</div></dt><dd>=C2=A0=C2=A0=C2=A0 No effect.<div>=C2=A0=C2=A0=C2=
=A0 No new keywords. </div><div>          =C2=A0=C2=A0=C2=A0 No new tokens.=
 </div><div>          =C2=A0=C2=A0=C2=A0 No changes to old syntax. </div><d=
iv>          =C2=A0=C2=A0=C2=A0 Pure extension. </div><div>          =C2=A0=
=C2=A0=C2=A0 Backward compatible.        </div></dd><dt><div class=3D"Naslo=
vPod ">=C2=A0 Library</div></dt><dd>=C2=A0=C2=A0=C2=A0 No effect.</dd><dt><=
div class=3D"NaslovPod ">=C2=A0 Existing code.</div></dt><dd>=C2=A0=C2=A0=
=C2=A0 No effect.</dd></dl></dd></div>

<p></p>

-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"https://groups.google.com/a/isocpp.org/group=
/std-proposals/">https://groups.google.com/a/isocpp.org/group/std-proposals=
/</a>.<br />

------=_Part_1_1827313706.1451743705447--
------=_Part_0_1484563950.1451743705442--

.
