Topic: First class tags for named constructors and much more


Author: mihailnajdenov@gmail.com
Date: Mon, 16 Jul 2018 05:25:24 -0700 (PDT)
Raw View
------=_Part_11053_1672965350.1531743924231
Content-Type: multipart/alternative;
 boundary="----=_Part_11054_1030164733.1531743924237"

------=_Part_11054_1030164733.1531743924237
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

This is a continuation=20
of https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLu=
tWGp4I

To recap the problem itself, here is the c++FAQ entry about it=20
http://www.cs.technion.ac.il/users/yechiel/c++-faq/named-ctor-idiom.html


Sidenote. Some will argue the problem is most correctly solved by=20
> introducing new type(s). =20

In that particular case this might be true, but that is not always the case=
=20
> - often a new type is not the best solution, =20

either because the type would be completely superficial or because it is=20
> not feasible to introduce and maintain dozens of types, not used outside =
a=20
> limited context.

=20

*Part 1: Intro*

This topic suggests building upon the tag idiom, already used throughout=20
std, to enable "named constructors" by a way of "label arguments"

Here are the improvements over the idiom

   - provide a trivial way to create tag arguments (label arguments)
   - provide out-of-the-box way for the labels not to interfere with the=20
   rest of the types and the variables
   - provide ways for the labels to "just work" on the call site with the=
=20
   least qualification possible
   - provide syntax for the labels to be visually district from regular=20
   arguments (which gives invaluable semantic context to the reader of the=
=20
   code)
   - provide a way the labels to look the same on the declaration and on=20
   the call site (WYSIWYG)

If these points are done right, in a way, we have an enabling technology -=
=20
a better way to create interfaces.=20
interfaces that are not less expressive then named functions, while still=
=20
working well with other key language features like constructors and=20
template metaprogramming.

Without further ado, lets solve the problem c++faq presented using label=20
arguments.

class Point=20
{
public:
  case struct cartesian;
  case struct polar;

  Point(case cartesian, float x, float y) {. . .}
  Point(case polar, float r, float a) {. . .}
};

int main()
{
  Point p1 =3D Point(cartesian: 5.7, 1.2);=20
  Point p2 =3D Point(polar: 5.7, 1.2);=20

  return 0;
}

That's it.

What do we gain over the static functions? Quite a lot actually

   - No code refactor to transform a constructor to a static function. (no=
=20
   knowledge of static functions for that matter)
   - Very similar, yet expressive, syntax on the call side
   - All the benefits of using a constructor:
      -  Use all the tools that expect a constructor - heap allocation with=
=20
      new , make_*,call construct etc.=20
      -  Use all the tools metaprogramming gives like SFINAE.=20
      -  Self-explanatory what actually creates the object, no=20
      documentation or convention needed.
      -  Take advantage of template deduction guides if necessary.
  =20
Each one of these is a considerable win, no matter how one looks at it!
It is no wonder the tag idiom is adopted in the standard library, lets try=
=20
to implement the above using it.

class Point=20
{
public:
  struct labels *//< or a namespace outside class*
  {
    struct cartesian_t{  explicit cartesian_t() =3D default; };
    struct polar_t{  explicit polar_t() =3D default; };
     =20
    inline static constexpr auto cartesian =3D cartesian_t();
    inline static constexpr auto polar =3D polar_t();
  };
   =20
  Point(labels::cartesian_t, float x, float y) {}
  Point(labels::polar_t, float r, float a) {}
};

int main()
{
  Point p1 =3D Point(Point::labels::cartesian, 5.7, 1.2);=20
  Point p2 =3D Point(Point::labels::polar, 5.7, 1.2);=20
       =20
  return 0;
}

Not that bad, or?=20
Here are the list of problem with this "by hand" solution

*- First -*

*Experts only!* On the call site it might be "fine", but no junior to=20
intermediate programmer will *dare* implementing this interface of its own=
=20
objects.=20

Dummy class as scope, empty structs, explicit, default, inline, static - we=
=20
used half of the keywords in C++ together with non-obvious idioms like=20
empty classes.

At what stage one teaches this to students?
At what stage one *recommends* this?=20
I know the answer - * only if the staff you want to do is even more=20
complex! *

But, our case is *trivial**! *This leaves the only practical approach for=
=20
non-experts to be static functions with all their downsides.=20

Yet, even for experts, the situation is far from ideal.

*- Second -*

There is no association b/w the type present in the declaration and the=20
object used on the call site - We have to use a convention.
The problem with conventions is, they can't be reinforced, and indeed they=
=20
are broken or even non-existent - std::sequenced_policy does not indicate=
=20
in *any* way std::execution::par can be used on the call site.

To use the interface *one must read the documentation*.=20


*- Third -*

There is no way to tell an argument is a tag and not a normal, user-side=20
object.

To use the interface *one must read the documentation*.=20


*- Forth -*

Because these are regular types, we must go through hoops to protect ageist=
=20
name collisions both for the type and the object.

This is crucial if we want any form of natural naming on the tags!

For example

class circle;
//...
shape(labels::circle_t, . . .); //< object is 'circle'

Here circle is good first choice for *both* a label object name *and* a=20
concrete type.

However, if we use qualified names, we lose natural naming almost by=20
definition.=20
It is a lose-lose situation - we go the extra mile to protect our names,=20
and yet if there is a collision, we are not able to use them naturally.


- Fifth -

Even with no collision we are forced to use qualified names in many cases=
=20
as the code would be *impossible* for a human to parse correctly otherwise.

rect(point pos, size sz);
rect(labels::center_t, point val, size sz=3D{10,10});

// user

rect(center, {10,10}); *//< which constructor is called? No way to tell=20
without tracking 'center' down *
*                       // to see if it is a tag object or the name of some=
=20
variable of type point*

Of course, the alternative is to use "smart naming".=20

An example from std:

std::allocator_arg

Hardly the best option. We will return to this example again later.


- Sixth -

labels is just a convention, and as with all conventions, it will be broken=
=20
or not be present at all.

If that's not bad enough, we still risk collision this time with the scope=
=20
name itself.


Now, before we dive into details, lets see some more examples

case struct center;
case struct bottomLeft;

struct circle
{
  circle(point p, size sz);
  circle(case bottomLeft, point p, size sz);
};

case struct circle;
case struct rect;

struct shape
{
  template<class... Args>
  shape(case circle, Args&&...); *//< "in-place" construct a circle as=20
shape*
  shape(circle, color);  *//< *from object of type circle

  template<class... Args>
  shape(case rect, Args&&...); *//< **"in-place" **overload for rect*
};

// usage highlights

const auto circle =3D mycircle();
shape(circle, red); //< as usual, from object of type circle

shape(circle: bottomLeft: p, sz); *//< calling implicit "named constructor"=
=20
for circle - impossible with static functions!*

auto sh =3D std::make_shared<shape>(circle: p, sz); *//< yep, it works - th=
e=20
label is not part of the name of the function!*

Also note, we can build any shape using SFINAE.


The usefulness of this idiom is by no means limited to constructors.

We can imagine

write(Data);
write(case noCommit, Data);

This is more then valuable alternative to any of the current methods - a=20
bool argument, an enum argument or a different function name.=20
For a real word example one should look no further then parallel stl.

Lets return to constructors

Label arguments are transparent to the type system once bound to a typename=
..
As a result template argument deduction just works, again, something=20
*impossible* with static functions.=20

template<class T>
struct rect
{=20
  template<LabelArg StartPoint, Point2D Pos, Size2D Size>
  rect(StartPoint, Pos, Size) {}
  T x,y,w,h;
}

template<LabelArg StartPoint, Point2D Pos, Size2D Size>
rect(StartPoint, Pos, Size) -> rect<best_type_t<StartPoint, storage_t<Pos>,=
=20
storage_t<Size>>>;=20

// user

rect(center: floatPoint{}, intSize{12,12}); *//< rect<best_type>*


Lastly, lets  look at std::allocator_arg again.=20
With proper tag support inviting new "descriptive" names is not needed

namespace std {
case struct allocator;
}

// user=20

using namespace std; //< just to highlight the lack of collision
                     // note that it is incorrect as the user must be able=
=20
to tell, a std::allocator label is required.=20

template<Allocator allocator>
object(. . ., case allocator, allocator alloc);

// invoke

object(. . ., std::allocator: MyAllocator{});


Part 2: Details

Lets break it all down.


Labels are declared-and-defined simply by prepending case to (possibly=20
templated) class or struct declaration.=20

case struct center;

This will create *roughly* the equivalent code, in the enclosing scope =20

label_scope *//< name is just for illustration, the compiler picks the name=
*
{
  struct center { /*explicit ctor, spaceship or whatever*/  };
  inline static constexpr auto center_v =3D center();=20
}

label_scope is implementation defined, but it should probably be either a=
=20
class, if the enclosing scope is a class, or a namespace, if the enclosing=
=20
scope is a namespace.

In any case this scope *should never collide with any other namespace (or=
=20
class)* even if this means a separate name for every TU. The name will=20
*never* be visible and it is purely implementation detail.

At this point we have a type and a constant that are invisible for the rest=
=20
of the typesystem, which is, as we saw, what we need.

To bring the type into scope, one must use case before its name. This will =
prepend=20
the hidden scope name to the type name.

case center =3D=3D label_scope::center

case std::allocator =3D=3D std::label_scope::allocator

Used in this way, the label becomes a regular type name and can be used in=
=20
any place type is required=20

void (*)(case center, point, size);
std::is_same<case center, case foo::center>_v;

constexpr auto c =3D case circle{};
using T =3D case circle; *// or even "using circle =3D case circle;"*

Other then the type, we also need the constant.=20

Although we could simply create instances of the label type, this is far=20
> from perfect and not what the established practice is currently.


To get the constant we append colon (:) to its name.

This will first append the hidden scope, then instead of the type, it will=
=20
fetch the constant:

circle: =3D=3D label_scope::circle_v

*However*, because the need for the constant is limited to only 3 cases - =
=20
a function call, to take its address and to declare it as default argument,=
=20
I suggest to allow the syntax *only in the first case* - to call a function=
..
=20

Default labels will always look awkward, besides, one can still construct{}=
=20
> it.=20

Taking the address, for whatever reason, can be done using std::addressof, =
which=20
> itself is a function.


This restriction prevents us from collision with any C labels and from=20
funky code like &circle:;

The syntax case label: is not allowed as it is not needed and makes it=20
> easier to prevent any collision with switch statement labels.


There are two more pieces left.=20

*The first one*, is to allow the comma after a label to be omitted.
This means that both of these are the same

shape(circle:, r, a);

shape(circle: r, a);

This "quirk" can be something positive as this will aid teaching the fact,=
=20
> labels are just arguments.=20

Not only that, but some might as well preferer using the comma for all=20
> argument passing.

Lastly, if we are to ever have named arguments this can be used to be extra=
=20
> clear, we are passing a label argument, not naming a regular argument.
>

In any case, the colon is *vital* for reading code in the correct context,=
=20
not unlike human language.

*Second*, and more importantly, we introduce special rules to deduce=20
unqualified, or partially qualified, label names.

The reason for this is before everything else a semantic one:

Normal arguments are user-created object, they live predominately in user=
=20
code and are foreign to the function.
Label arguments, quite the opposite, they are as much as part of the=20
function as its name (semantically, not technically) - they,=20
in the *overhelping* majority in cases, do *not* live in user code.

The only exception is specializing for the stl (like std::allocator) or=20
> specializing the stl itself (like introducing new execution policies).

We saw that the first case works as expected - one just passes the=20
> std-provided label object to mark the custom allocator.=20

The second case is a bit more tricky and might force the user to do an=20
> explicit call to the label argument to prevent the std one being picked b=
y=20
> default.

This can be trivially resolved by providing a user-facing interface in=20
> non-std namespace, which delegates the call to the correctly qualified st=
d=20
> function


With that in mind there is no reason to apply standard lookup rules to=20
functions, called with a label argument.=20
I*nstead of looking for the function in the namespaces of the label=20
argument, we look for the label argument in the enclosing scope of the=20
function.*

This will allow us to have natural label expressions, without the need of u=
sing=20
in the enclosing namespaces or the need to qualify the labels.=20

Point p1 =3D Point(cartesian: 5.7, 1.2); //< label_scope::cartesian looked =
in=20
the enclosing scope of Point::Point(. . .), which is the Point class

A hypothetical

namespace std {
case struct in_place;
=E2=80=A6
template<class... Args >=20
optional(case in_place, Args&&... args );
}

// user

case struct in_place;

void func()=20
{
  std::optional<string>(in_place: 3, 'A'); *//< in_place in std used *
*// *std::optional<string>(::in_place: 3, 'A'); *//< ::in_place used*
}

Another example

struct circle
{
  case struct bottomLeft;
  ...
  circle(case bottomLeft, point p, size sz);
};

using std::optional;
optional<circle>(in_place: bottomLeft: p, sz); //< in_place still in std,=
=20
bottomLeft in circle

Lookup like this might be easer said then done, there is no denying=20
however, it is the more correct one in general - where the label is located=
=20
depends on the function, not the other way around.

It is hard to tell if such a lookup will make finding the function itself=
=20
> harder or easer - after all, the fact that the compiler knows the argumen=
t=20
> is label one, dramatically can limit the overlanding set, =20

no matter in which namespace is *either* the function *or* the label=20
> argument. In a way, all labels are as if a subclass of just one parent=20
> class, culling based on that *should* help lookup. =20



*Part 3: Status Quo*

Sadly, we can't make current standard types, used as tags, "just work" as=
=20
label arguments, not without introducing completely new, parallel rules.=20
Even if we do, the results will be partial - the dissonance b/w declaration=
=20
and invocation will still be present.=20
We also can't silently change the lookup rules without breaking user code,=
=20
the best we can do is allow colon as separator of "tag classes" (empty=20
classes with explicit ctor),
but this, is as I said, completely parallel rule with questionable benefits=
..

It should be noted, migrating the stl to labels is trivial - it literally=
=20
> means two lines of code for every function using a tag. One to introduce =
a=20
> case struct, reusing the old name, and one to create a forwarding overloa=
d.

Doing this will give us all the benefits of using labels - association b/w=
=20
> declaration and invocation, better lookup rules and more expressive synta=
x.



Beyond that we could rethink the naming variations of some standard=20
functions. The name of the function is to describe what the function *does*
,=20
if we are forced to name the function based on what the arguments are (to=
=20
make it more clear), or invent names to avoid redeclaration, then we have=
=20
limitation of the function declaration syntax.
This proposal is *not* well suited for the first case, but is quite well=20
suited for the latter.

For example, std::find is descriptive to anyone, including a=20
non-programmer, however find_if - not so much, if at all.

By naming the entire function this way it is implied *the function itself *=
have=20
some sort of prerequisite of to when and if the finding process takes place=
=20
- *"perform finding (only) if something, otherwise - bail out"*.
However by simply shifting the "if" part to the comparison function we=20
radically improve the communication with the user.

std::find(begin, end, if: [value](auto val){. . .});

On one hand we keep the name intact - find still does exactly the same as=
=20
before, no need for a name change, *how* it does the search has changed=20
however, and we have the opportunity to specify this naturally, as an=20
argument.
On the other hand, by moving if right next to the predicate it is=20
immediately clear - *"if this returns true, we found our match"*.=20

It is arguably the single most clear interface possible, and it is all=20
about human language.


*Part 4: Conclusion*

Presented here was a method for introducing human (and templates) friendly=
=20
functions, that are easier to define then static functions, when used as=20
"named constructor",=20
and at the same time are more expressive, even for normal functions, as the=
=20
"naming" can be done in-between arguments.
The method is also as powerful as the current tag idiom, used in generic=20
code, yet much easier (and more clear) in both declaration and usage.

By having these qualities this feature has the potential to combine the two=
=20
idioms into one core feature, usable across the entire spectrum of C++=20
programmers expertise.


Thank You for Your time!

--=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.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/7ad94c40-9a52-4bb3-9aaa-cc885407e9bd%40isocpp.or=
g.

------=_Part_11054_1030164733.1531743924237
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>This is a continuation of=C2=A0https://groups.google.=
com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I</div><div><br></di=
v><div><span style=3D"display: inline !important; float: none; background-c=
olor: transparent; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&=
quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: normal; font-=
variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text=
-align: left; text-decoration: none; text-indent: 0px; text-transform: none=
; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">=
To recap the problem itself, here is the c++FAQ entry about it http://www.c=
s.technion.ac.il/users/yechiel/c++-faq/named-ctor-idiom.html</span><br></di=
v><div><br></div><div><div style=3D"background-color: transparent; border-b=
ottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-widt=
h: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-=
slice: 100%; border-image-source: none; border-image-width: 1; border-left-=
color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(34, 34, 34); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; borde=
r-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;=
quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style=
: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; m=
argin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; or=
phans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddi=
ng-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; tex=
t-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; wor=
d-spacing: 0px;"><br style=3D"background-attachment: scroll; background-cli=
p: border-box; background-color: transparent; background-image: none; backg=
round-origin: padding-box; background-position-x: 0%; background-position-y=
: 0%; background-repeat: repeat; background-size: auto; border-bottom-color=
: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bor=
der-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%=
; border-image-source: none; border-image-width: 1; border-left-color: rgb(=
34, 34, 34); border-left-style: none; border-left-width: 0px; border-right-=
color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; =
border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width=
: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;=
quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; height: auto; margin-=
bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-widt=
h: 0px; overflow: visible; overflow-x: visible; overflow-y: visible; paddin=
g-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></=
div><blockquote class=3D"gmail_quote" style=3D"background-color: transparen=
t; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-=
left-width: 1px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;q=
uot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style:=
 normal; font-variant: normal; font-weight: 400; letter-spacing: normal; ma=
rgin-bottom: 0px; margin-left: 5.38px; margin-right: 0px; margin-top: 0px; =
orphans: 2; padding-left: 6.73px; text-align: left; text-decoration: none; =
text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; whi=
te-space: normal; word-spacing: 0px;">Sidenote. Some will argue the problem=
 is most correctly solved by introducing new type(s). =C2=A0</blockquote><b=
lockquote class=3D"gmail_quote" style=3D"background-color: transparent; bor=
der-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-w=
idth: 1px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&=
amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: norma=
l; font-variant: normal; font-weight: 400; letter-spacing: normal; margin-b=
ottom: 0px; margin-left: 5.38px; margin-right: 0px; margin-top: 0px; orphan=
s: 2; padding-left: 6.73px; text-align: left; text-decoration: none; text-i=
ndent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-spa=
ce: normal; word-spacing: 0px;">In that particular case this might be true,=
 but that is not always the case - often a new type is not the best solutio=
n, =C2=A0</blockquote><blockquote class=3D"gmail_quote" style=3D"background=
-color: transparent; border-left-color: rgb(204, 204, 204); border-left-sty=
le: solid; border-left-width: 1px; color: rgb(34, 34, 34); font-family: &am=
p;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size:=
 13px; font-style: normal; font-variant: normal; font-weight: 400; letter-s=
pacing: normal; margin-bottom: 0px; margin-left: 5.38px; margin-right: 0px;=
 margin-top: 0px; orphans: 2; padding-left: 6.73px; text-align: left; text-=
decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stro=
ke-width: 0px; white-space: normal; word-spacing: 0px;">either because the =
type would be completely superficial or because it is not feasible to intro=
duce and maintain dozens of types, not used outside a limited context.</blo=
ckquote><div>=C2=A0</div><div><br></div><div><b>Part 1: Intro</b></div><div=
><b></b><br></div><div>This topic suggests building upon the tag idiom, alr=
eady used throughout std, to enable &quot;named constructors&quot; by a way=
 of &quot;label arguments&quot;</div></div><div><br></div><div>Here are the=
 improvements over the idiom</div><ul><li>provide a trivial way to create t=
ag arguments (label arguments)</li><li>provide out-of-the-box way for the l=
abels not to interfere with the rest of the types and the variables</li><li=
>provide ways for the labels to &quot;just work&quot; on the call site with=
 the least qualification possible</li><li>provide syntax for the labels to =
be visually district from regular arguments (which gives invaluable semanti=
c context to the reader of the code)</li><li>provide a way the labels to lo=
ok the same on the declaration and on the call site (WYSIWYG)</li></ul><div=
>If these points are done right, in a way, we have an enabling technology -=
 a better way to create interfaces.=C2=A0</div><div>interfaces that are not=
 less expressive then named functions, while still working well with other =
key language features like constructors and template metaprogramming.</div>=
<div><br></div><div>Without further ado, lets solve the problem c++faq pres=
ented using label arguments.</div><div><br></div><div><font face=3D"courier=
 new,monospace"> class Point=C2=A0</font></div><div><font face=3D"courier n=
ew,monospace">{<br></font></div><div><font face=3D"courier new,monospace">p=
ublic:</font></div><div><font face=3D"courier new,monospace">=C2=A0=C2=A0<s=
pan style=3D"display: inline !important; float: none; background-color: tra=
nsparent; color: rgb(34, 34, 34); font-family: courier new,monospace; font-=
size: 13px; font-style: normal; font-variant: normal; font-weight: 400; let=
ter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; t=
ext-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; whit=
e-space: normal; word-spacing: 0px;">case struct cartesian;</span></font></=
div><div><font face=3D"courier new,monospace">=C2=A0 case struct polar;</fo=
nt></div><div><font face=3D"courier new,monospace"><br></font></div><font f=
ace=3D"courier new,monospace">=C2=A0 Point(case <span style=3D"display: inl=
ine !important; float: none; background-color: transparent; color: rgb(34, =
34, 34); font-family: courier new,monospace; font-size: 13px; font-style: n=
ormal; font-variant: normal; font-weight: 400; letter-spacing: normal; orph=
ans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-tra=
nsform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spa=
cing: 0px;">cartesian, </span>float x, float y) {. . .}<br>=C2=A0 Point(cas=
e polar, float r, float a) {. . .}<br>};</font><div><b></b><i></i><u></u><s=
ub></sub><sup></sup><strike></strike><br></div><font face=3D"courier new,mo=
nospace">int main()<br>{<br>=C2=A0 Point p1 =3D Point(<span style=3D"backgr=
ound-color: transparent; border-bottom-color: rgb(34, 34, 34); border-botto=
m-style: none; border-bottom-width: 0px; border-image-outset: 0; border-ima=
ge-repeat: stretch; border-image-slice: 100%; border-image-source: none; bo=
rder-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style:=
 none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-=
right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 3=
4); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); =
display: inline; float: none; font-family: courier new,monospace; font-size=
: 13px; font-style: normal; font-variant: normal; font-weight: 400; letter-=
spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; m=
argin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding=
-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; tex=
t-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-=
space: normal; word-spacing: 0px;">cartesian</span>: 5.7, 1.2);=C2=A0<br><d=
iv>=C2=A0 Point p2 =3D Point(polar: 5.7, 1.2);=C2=A0</div><div><br></div><d=
iv>=C2=A0 <span style=3D"display: inline !important; float: none; backgroun=
d-color: transparent; color: rgb(34, 34, 34); font-family: courier new,mono=
space; font-size: 13px; font-style: normal; font-variant: normal; font-weig=
ht: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decorat=
ion: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-widt=
h: 0px; white-space: normal; word-spacing: 0px;">return 0;</span></div></fo=
nt><div><font face=3D"courier new,monospace">}</font></div><div><font face=
=3D"courier new,monospace"><br></font></div><div><font face=3D"arial,sans-s=
erif">That&#39;s it.</font></div><div><font face=3D"courier new,monospace">=
<font face=3D"arial,sans-serif"></font><br></font></div><div><font face=3D"=
arial,sans-serif">What do we gain over the static functions? Quite a lot ac=
tually</font></div><font face=3D"arial,sans-serif"><ul><li>No code refactor=
 to transform a constructor to a static function. (no knowledge of static f=
unctions for that matter)</li><li>Very similar, yet expressive, syntax on t=
he call side</li><li>All the benefits of using a constructor:</li><ul><li><=
b>=C2=A0</b>Use all the tools that expect a constructor - heap allocation w=
ith <font face=3D"courier new,monospace">new</font> , <font face=3D"courier=
 new,monospace">make_*,<font face=3D"arial,sans-serif">call</font> construc=
t <font face=3D"arial,sans-serif">etc</font>.=C2=A0</font></li><li><b>=C2=
=A0</b>Use all the tools <span style=3D"display: inline !important; float: =
none; background-color: transparent; color: rgb(34, 34, 34); font-family: a=
rial,sans-serif; font-size: 13px; font-style: normal; font-variant: normal;=
 font-weight: 400; letter-spacing: normal; line-height: 17px; orphans: 2; t=
ext-align: left; text-decoration: none; text-indent: 0px; text-transform: n=
one; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px=
;">metaprogramming gives like</span> SFINAE.=C2=A0</li><li><b>=C2=A0</b>Sel=
f-explanatory what actually creates the object, no documentation or convent=
ion needed.</li><li><b>=C2=A0</b>Take advantage of template deduction guide=
s if necessary.</li></ul></ul><div>Each one of these is a considerable win,=
 no matter how one looks at it!<br></div><div>It is no wonder the tag idiom=
 is adopted in the standard library, lets try to implement the above using =
it.</div></font><div><font face=3D"courier new,monospace"></font><br></div>=
<div><font face=3D"courier new,monospace">class Point <br>{<br>public:<br>=
=C2=A0 struct labels <i>//&lt; or a namespace outside class</i><br>=C2=A0 {=
<br>=C2=A0=C2=A0=C2=A0 struct cartesian_t{=C2=A0 explicit cartesian_t() =3D=
 default; };<br>=C2=A0=C2=A0=C2=A0 struct polar_t{=C2=A0 explicit polar_t()=
 =3D default; };<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <br>=C2=A0=C2=A0=C2=A0 i=
nline static constexpr auto cartesian =3D cartesian_t();<br>=C2=A0=C2=A0=C2=
=A0 inline static constexpr auto polar =3D polar_t();<br>=C2=A0 };<br>=C2=
=A0=C2=A0=C2=A0 </font></div><div><font face=3D"courier new,monospace">=C2=
=A0 Point(labels::cartesian_t, float x, float y) {}<br>=C2=A0 Point(labels:=
:polar_t, float r, float a) {}<br>};</font></div><div><font face=3D"courier=
 new,monospace"><br></font></div><div><font face=3D"courier new,monospace">=
int main()<br>{<br>=C2=A0 Point p1 =3D Point(Point::labels::cartesian, 5.7,=
 1.2); <br>=C2=A0 Point p2 =3D Point(Point::labels::polar, 5.7, 1.2); <br>=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <br>=C2=A0 return 0;<br>}</font>=
<br></div><div><font face=3D"arial,sans-serif"><br></font></div><div><font =
face=3D"arial,sans-serif">Not that bad, or?=C2=A0</font><br></div><div><fon=
t face=3D"arial,sans-serif">Here are the list of problem with this &quot;by=
 hand&quot; solution</font></div><div><font face=3D"arial,sans-serif"><br><=
/font></div><div><font face=3D"arial,sans-serif"><b>- First -</b></font></d=
iv><div><font face=3D"arial,sans-serif"><b><br></b></font></div><div><font =
face=3D"arial,sans-serif"><i>Experts only!</i> On the call site it might be=
 &quot;fine&quot;, but no junior to intermediate programmer will <i><b>dare=
</b></i> implementing this interface of its own objects.=C2=A0</font></div>=
<div><font face=3D"arial,sans-serif"><br></font></div><div><font face=3D"ar=
ial,sans-serif">D</font><font face=3D"arial,sans-serif">ummy class as scope=
, empty structs, explicit, default, inline, static - w</font><font face=3D"=
arial,sans-serif">e used half of the keywords in C++ </font>together with <=
font face=3D"arial,sans-serif">non-obvious idioms like empty classes.</font=
></div><div><font face=3D"arial,sans-serif"><br></font></div><div><font fac=
e=3D"arial,sans-serif">At what stage one </font>teaches <font face=3D"arial=
,sans-serif">this to students?<br></font></div><font face=3D"arial,sans-ser=
if"><div><span style=3D"display: inline !important; float: none; background=
-color: transparent; color: rgb(34, 34, 34); font-family: arial,sans-serif;=
 font-size: 13px; font-style: normal; font-variant: normal; font-weight: 40=
0; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: n=
one; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px=
; white-space: normal; word-spacing: 0px;">At what stage </span>one <i>reco=
mmends</i> this?=C2=A0<br></div><div>I know the answer -=C2=A0<i> only if t=
he staff you want to do is even more complex!=C2=A0</i></div><div><i><br></=
i></div></font><div><font face=3D"arial,sans-serif">But, our case is <i>tri=
vial</i></font><i>! </i><font face=3D"arial,sans-serif">This leaves the onl=
y practical approach for non-experts to be static functions with all their =
downsides.=C2=A0</font></div><div><font face=3D"arial,sans-serif"><br></fon=
t></div><font face=3D"arial,sans-serif"><div>Y<span style=3D"display: inlin=
e !important; float: none; background-color: transparent; color: rgb(34, 34=
, 34); font-family: arial,sans-serif; font-size: 13px; font-style: normal; =
font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2;=
 text-align: left; text-decoration: none; text-indent: 0px; text-transform:=
 none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0=
px;">et, even for experts, the situation is far from ideal.</span><br></div=
></font><div><font face=3D"arial,sans-serif"><b></b><i></i><u></u><sub></su=
b><sup></sup><strike></strike><br></font></div><div><font face=3D"arial,san=
s-serif"><b>- Second -</b></font><br></div><div><font face=3D"arial,sans-se=
rif"><br></font></div><div><font face=3D"arial,sans-serif">There is no asso=
ciation b/w the type present in the declaration and the object used on the =
call site - We have to use a convention.</font></div><div><font face=3D"ari=
al,sans-serif">The problem with conventions is, they can&#39;t be reinforce=
d, and indeed they are broken or even non-existent - <font face=3D"courier =
new,monospace">std::</font><span style=3D"text-align: left; color: rgb(0, 0=
, 0); text-transform: none; line-height: 14.08px; text-indent: 0px; letter-=
spacing: normal; font-size: 12.8px; font-style: normal; font-variant: norma=
l; font-weight: 400; text-decoration: none; word-spacing: 0px; display: inl=
ine !important; white-space: nowrap; orphans: 2; float: none; -webkit-text-=
stroke-width: 0px; background-color: transparent;"><font face=3D"courier ne=
w,monospace">sequenced_policy</font> does not indicate in <b>any</b> way <f=
ont face=3D"courier new,monospace">std::execution::par </font>can be used o=
n the call site.</span></font></div><div><font face=3D"arial,sans-serif"><s=
pan style=3D"text-align: left; color: rgb(0, 0, 0); text-transform: none; l=
ine-height: 14.08px; text-indent: 0px; letter-spacing: normal; font-size: 1=
2.8px; font-style: normal; font-variant: normal; font-weight: 400; text-dec=
oration: none; word-spacing: 0px; display: inline !important; white-space: =
nowrap; orphans: 2; float: none; -webkit-text-stroke-width: 0px; background=
-color: transparent;"><br></span></font></div>To use the interface <i>one m=
ust read the documentation</i>.=C2=A0<div><font face=3D"arial,sans-serif"><=
b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><b></b><i></i><u=
></u><sub></sub><sup></sup><strike></strike><font face=3D"courier new,monos=
pace"></font><font face=3D"courier new,monospace"></font><font color=3D"#b0=
0000"></font><br></font></div><div><font face=3D"arial,sans-serif"><br></fo=
nt></div><div><font face=3D"arial,sans-serif"><div style=3D"background-colo=
r: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bo=
rder-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-sty=
le: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); borde=
r-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-fami=
ly: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; fon=
t-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; l=
etter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: =
0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; p=
adding-right: 0px; padding-top: 0px; text-align: left; text-decoration: non=
e; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; =
white-space: normal; word-spacing: 0px;"><font face=3D"arial,sans-serif" st=
yle=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bor=
der-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch=
; border-image-slice: 100%; border-image-source: none; border-image-width: =
1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-left=
-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none;=
 border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-sty=
le: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px;"><b style=3D"background-attachment: scro=
ll; background-clip: border-box; background-color: transparent; background-=
image: none; background-origin: padding-box; background-position-x: 0%; bac=
kground-position-y: 0%; background-repeat: repeat; background-size: auto; b=
order-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bott=
om-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border=
-image-slice: 100%; border-image-source: none; border-image-width: 1; borde=
r-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: =
0px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-=
right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none=
; border-top-width: 0px; color: rgb(34, 34, 34); font-family: arial,sans-se=
rif; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible; overf=
low-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px=
; padding-right: 0px; padding-top: 0px;">- Third -</b></font></div><div sty=
le=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34); =
border-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0=
; border-image-repeat: stretch; border-image-slice: 100%; border-image-sour=
ce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border=
-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, =
34); border-right-style: none; border-right-width: 0px; border-top-color: r=
gb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(3=
4, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;=
quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: normal=
; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left=
: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px;=
 padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;=
 text-decoration: none; text-indent: 0px; text-transform: none; -webkit-tex=
t-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><font face=3D=
"arial,sans-serif" style=3D"border-bottom-color: rgb(34, 34, 34); border-bo=
ttom-style: none; border-bottom-width: 0px; border-image-outset: 0; border-=
image-repeat: stretch; border-image-slice: 100%; border-image-source: none;=
 border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-sty=
le: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bord=
er-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34=
, 34); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; m=
argin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; p=
adding-left: 0px; padding-right: 0px; padding-top: 0px;"><b style=3D"backgr=
ound-attachment: scroll; background-clip: border-box; background-color: tra=
nsparent; background-image: none; background-origin: padding-box; backgroun=
d-position-x: 0%; background-position-y: 0%; background-repeat: repeat; bac=
kground-size: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-sty=
le: none; border-bottom-width: 0px; border-image-outset: 0; border-image-re=
peat: stretch; border-image-slice: 100%; border-image-source: none; border-=
image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none=
; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right=
-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); b=
order-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-=
family: arial,sans-serif; font-size: 13px; height: auto; margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; ove=
rflow: visible; overflow-x: visible; overflow-y: visible; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><br style=3D"=
background-attachment: scroll; background-clip: border-box; background-colo=
r: transparent; background-image: none; background-origin: padding-box; bac=
kground-position-x: 0%; background-position-y: 0%; background-repeat: repea=
t; background-size: auto; border-bottom-color: rgb(34, 34, 34); border-bott=
om-style: none; border-bottom-width: 0px; border-image-outset: 0; border-im=
age-repeat: stretch; border-image-slice: 100%; border-image-source: none; b=
order-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style=
: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border=
-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, =
34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34);=
 font-family: arial,sans-serif; font-size: 13px; height: auto; margin-botto=
m: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0p=
x; overflow: visible; overflow-x: visible; overflow-y: visible; padding-bot=
tom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></b></f=
ont></div><div style=3D"background-color: transparent; border-bottom-color:=
 rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bord=
er-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%;=
 border-image-source: none; border-image-width: 1; border-left-color: rgb(3=
4, 34, 34); border-left-style: none; border-left-width: 0px; border-right-c=
olor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; b=
order-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width:=
 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;q=
uot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; fo=
nt-variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom=
: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; pa=
dding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;=
 text-align: left; text-decoration: none; text-indent: 0px; text-transform:=
 none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0=
px;"><font face=3D"arial,sans-serif" style=3D"border-bottom-color: rgb(34, =
34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-=
outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-i=
mage-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34=
); border-left-style: none; border-left-width: 0px; border-right-color: rgb=
(34, 34, 34); border-right-style: none; border-right-width: 0px; border-top=
-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; mar=
gin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padd=
ing-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=
There is no way to tell an argument is a tag and not a normal, user-side ob=
ject.</font></div><div style=3D"background-color: transparent; border-botto=
m-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0=
px; border-image-outset: 0; border-image-repeat: stretch; border-image-slic=
e: 100%; border-image-source: none; border-image-width: 1; border-left-colo=
r: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border=
-right-color: rgb(34, 34, 34); border-right-style: none; border-right-width=
: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-to=
p-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot=
;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: no=
rmal; font-variant: normal; font-weight: 400; letter-spacing: normal; margi=
n-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphan=
s: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-t=
op: 0px; text-align: left; text-decoration: none; text-indent: 0px; text-tr=
ansform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-sp=
acing: 0px;"><font face=3D"arial,sans-serif" style=3D"border-bottom-color: =
rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; borde=
r-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; =
border-image-source: none; border-image-width: 1; border-left-color: rgb(34=
, 34, 34); border-left-style: none; border-left-width: 0px; border-right-co=
lor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bo=
rder-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: =
0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0=
px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top=
: 0px;"><span style=3D"background-color: transparent; border-bottom-color: =
rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-i=
mage-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bor=
der-image-source: none; border-image-width: 1; border-left-color: rgb(0, 0,=
 0); border-left-style: none; border-left-width: 0px; border-right-color: r=
gb(0, 0, 0); border-right-style: none; border-right-width: 0px; border-top-=
color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; color: =
rgb(0, 0, 0); display: inline; float: none; font-size: 12.8px; font-style: =
normal; font-variant: normal; font-weight: 400; letter-spacing: normal; lin=
e-height: 14.08px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
 margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; t=
ext-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; whit=
e-space: nowrap; word-spacing: 0px;"><font color=3D"#004000"></font><br sty=
le=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-=
bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bo=
rder-image-slice: 100%; border-image-source: none; border-image-width: 1; b=
order-left-color: rgb(0, 0, 0); border-left-style: none; border-left-width:=
 0px; border-right-color: rgb(0, 0, 0); border-right-style: none; border-ri=
ght-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; bor=
der-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px=
; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0=
px; padding-top: 0px;"></span></font></div><div><span style=3D"display: inl=
ine !important; float: none; background-color: transparent; color: rgb(34, =
34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; f=
ont-size: 13px; font-style: normal; font-variant: normal; font-weight: 400;=
 letter-spacing: normal; orphans: 2; text-align: left; text-decoration: non=
e; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; =
white-space: normal; word-spacing: 0px;">To use the interface </span><i sty=
le=3D"background-attachment: scroll; background-clip: border-box; backgroun=
d-color: transparent; background-image: none; background-origin: padding-bo=
x; background-position-x: 0%; background-position-y: 0%; background-repeat:=
 repeat; background-size: auto; border-bottom-color: rgb(34, 34, 34); borde=
r-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bor=
der-image-repeat: stretch; border-image-slice: 100%; border-image-source: n=
one; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left=
-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(34=
, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34=
, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;=
,sans-serif; font-size: 13px; font-style: italic; font-variant: normal; fon=
t-weight: 400; height: auto; letter-spacing: normal; margin-bottom: 0px; ma=
rgin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; orphans=
: 2; overflow: visible; overflow-x: visible; overflow-y: visible; padding-b=
ottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-a=
lign: left; text-decoration: none; text-indent: 0px; text-transform: none; =
-webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">on=
e must read the documentation</i><span style=3D"display: inline !important;=
 float: none; background-color: transparent; color: rgb(34, 34, 34); font-f=
amily: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px;=
 font-style: normal; font-variant: normal; font-weight: 400; letter-spacing=
: normal; orphans: 2; text-align: left; text-decoration: none; text-indent:=
 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: no=
rmal; word-spacing: 0px;">.=C2=A0</span></div><div><b></b><i></i><u></u><su=
b></sub><sup></sup><strike></strike><br></div><div><br></div></font></div><=
div><font face=3D"arial,sans-serif"><b>- Forth -</b></font></div><div><font=
 face=3D"arial,sans-serif"><b><br></b></font></div><div><font face=3D"arial=
,sans-serif">Because these are regular types, we must go through hoops to p=
rotect ageist name collisions both for the type and the object.</font></div=
><div><font face=3D"arial,sans-serif"><br></font></div><div>This is crucial=
 if we want any form of natural naming on the tags!</div><div><br></div><di=
v>For example</div><div><br></div><div><span style=3D"display: inline !impo=
rtant; float: none; background-color: transparent; color: rgb(34, 34, 34); =
font-family: courier new,monospace; font-size: 13px; font-style: normal; fo=
nt-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; t=
ext-align: left; text-decoration: none; text-indent: 0px; text-transform: n=
one; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px=
;">class circle;</span></div><div><font face=3D"courier new,monospace">//..=
..</font></div><div><font face=3D"courier new,monospace">shape(labels::circl=
e_t, . . .); //&lt; object is &#39;circle&#39;</font><br></div><div><b></b>=
<i></i><u></u><sub></sub><sup></sup><strike></strike><b></b><i></i><u></u><=
sub></sub><sup></sup><strike></strike><font face=3D"courier new,monospace">=
</font><br></div><div><font face=3D"arial,sans-serif"><font face=3D"&quot;A=
rial&quot;,&quot;Helvetica&quot;,sans-serif"></font>Here <font face=3D"cour=
ier new,monospace">circle</font> is good first choice for <i>both</i> a lab=
el object name <i>and</i> a concrete type.</font><br></div><div><font face=
=3D"courier new,monospace"></font><font face=3D"arial,sans-serif"></font><b=
></b><i></i><u></u><sub></sub><sup></sup><strike></strike><font face=3D"ari=
al,sans-serif"></font><br></div><div>However, if we use <span style=3D"disp=
lay: inline !important; float: none; background-color: transparent; color: =
rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-=
serif; font-size: 13px; font-style: normal; font-variant: normal; font-weig=
ht: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decorat=
ion: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-widt=
h: 0px; white-space: normal; word-spacing: 0px;">qualified names</span>, we=
 lose natural naming almost by definition.=C2=A0</div><div>It is a lose-los=
e situation - we go the extra mile to protect our names, and yet if there i=
s a collision, we are not able to use them naturally.</div><div><br></div><=
div><br></div><div><span style=3D"display: inline !important; float: none; =
background-color: transparent; color: rgb(34, 34, 34); font-family: arial,s=
ans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-=
weight: 700; letter-spacing: normal; orphans: 2; text-align: left; text-dec=
oration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-=
width: 0px; white-space: normal; word-spacing: 0px;">- Fifth -</span></div>=
<div><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></div>=
<div>Even with no collision we are forced to use qualified names in many ca=
ses as the code would be <i>impossible</i> for a human to parse correctly o=
therwise.</div><div><br style=3D"background-attachment: scroll; background-=
clip: border-box; background-color: transparent; background-image: none; ba=
ckground-origin: padding-box; background-position-x: 0%; background-positio=
n-y: 0%; background-repeat: repeat; background-size: auto; border-bottom-co=
lor: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; =
border-image-outset: 0; border-image-repeat: stretch; border-image-slice: 1=
00%; border-image-source: none; border-image-width: 1; border-left-color: r=
gb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-rig=
ht-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0p=
x; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-wi=
dth: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&a=
mp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; height: auto; marg=
in-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-w=
idth: 0px; overflow: visible; overflow-x: visible; overflow-y: visible; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"=
></div><div><div style=3D"background-color: transparent; border-bottom-colo=
r: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bo=
rder-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100=
%; border-image-source: none; border-image-width: 1; border-left-color: rgb=
(34, 34, 34); border-left-style: none; border-left-width: 0px; border-right=
-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px;=
 border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-widt=
h: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp=
;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; =
font-variant: normal; font-weight: 400; letter-spacing: normal; margin-bott=
om: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; =
padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0p=
x; text-align: left; text-decoration: none; text-indent: 0px; text-transfor=
m: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing:=
 0px;"><font face=3D"courier new,monospace" style=3D"border-bottom-color: r=
gb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border=
-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; b=
order-image-source: none; border-image-width: 1; border-left-color: rgb(34,=
 34, 34); border-left-style: none; border-left-width: 0px; border-right-col=
or: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bor=
der-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0=
px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0p=
x; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top:=
 0px;">rect(point pos, size sz);</font><br></div></div><div><font face=3D"c=
ourier new,monospace">rect(labels::center_t, point val, size sz=3D{10,10});=
</font></div><div><font face=3D"courier new,monospace"><br></font></div><di=
v><font face=3D"courier new,monospace">// user</font><br></div><div><font f=
ace=3D"courier new,monospace"><br></font></div><div><font face=3D"courier n=
ew,monospace"><span style=3D"display: inline !important; float: none; backg=
round-color: transparent; color: rgb(34, 34, 34); font-family: courier new,=
monospace; font-size: 13px; font-style: normal; font-variant: normal; font-=
weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-dec=
oration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-=
width: 0px; white-space: normal; word-spacing: 0px;">rect(center, {10,10});=
 <i>//&lt; which constructor is called? No way to tell without tracking &#3=
9;center&#39; down=C2=A0</i></span></font></div><div><font face=3D"courier =
new,monospace"><span style=3D"display: inline !important; float: none; back=
ground-color: transparent; color: rgb(34, 34, 34); font-family: courier new=
,monospace; font-size: 13px; font-style: normal; font-variant: normal; font=
-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-de=
coration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke=
-width: 0px; white-space: normal; word-spacing: 0px;"><i>=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 // to see=
 if it is a tag object or the name of some variable of type point</i></span=
></font></div><div><font face=3D"courier new,monospace"><i></i><br></font><=
/div><div><font face=3D"arial,sans-serif">Of course, the alternative is to =
use &quot;smart naming&quot;.=C2=A0</font></div><div><br></div><div><font f=
ace=3D"arial,sans-serif">An example from std:</font></div><div><font face=
=3D"arial,sans-serif"><br></font></div><div><font face=3D"courier new,monos=
pace">std::allocator_arg</font><br></div><div><font face=3D"arial,sans-seri=
f"><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></font><=
/div><div><font face=3D"arial,sans-serif">Hardly the best option. We will r=
eturn to this example again later.</font></div><div><font face=3D"arial,san=
s-serif"><br></font></div><div><font face=3D"arial,sans-serif"><br></font><=
/div><div><font face=3D"courier new,monospace"><font face=3D"arial,sans-ser=
if"></font><span style=3D"display: inline !important; float: none; backgrou=
nd-color: transparent; color: rgb(34, 34, 34); font-family: arial,sans-seri=
f; font-size: 13px; font-style: normal; font-variant: normal; font-weight: =
700; letter-spacing: normal; orphans: 2; text-align: left; text-decoration:=
 none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0=
px; white-space: normal; word-spacing: 0px;">- Sixth -</span><b></b><i></i>=
<u></u><sub></sub><sup></sup><strike></strike><br></font></div><div><font f=
ace=3D"courier new,monospace"><b></b><i></i><u></u><sub></sub><sup></sup><s=
trike></strike><br></font></div><div><font face=3D"courier new,monospace">l=
abels</font><font face=3D"arial,sans-serif"> is just a convention, and as w=
ith all conventions, it will be broken or not be present at all.</font></di=
v><div><font face=3D"arial,sans-serif"><br></font></div><div><font face=3D"=
arial,sans-serif">If that&#39;s not bad enough, we </font>still <font face=
=3D"arial,sans-serif">risk collision</font> this time with the scope name i=
tself.</div><div><font face=3D"arial,sans-serif"></font><br></div><div><fon=
t face=3D"arial,sans-serif"></font><br></div><div><font face=3D"arial,sans-=
serif">Now, before we dive into details, lets see some more examples</font>=
</div><div><font face=3D"courier new,monospace"></font><font face=3D"arial,=
sans-serif"></font><br></div><div><font face=3D"courier new,monospace">case=
 struct center;</font></div><div><span style=3D"text-align: left; color: rg=
b(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: norm=
al; font-size: 13px; font-style: normal; font-variant: normal; font-weight:=
 400; text-decoration: none; word-spacing: 0px; display: inline !important;=
 white-space: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0=
px; background-color: transparent;"><font face=3D"courier new,monospace">ca=
se struct bottomLeft;</font></span></div><div><font face=3D"courier new,mon=
ospace"></font><br></div><div><div style=3D"background-color: transparent; =
border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bot=
tom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; borde=
r-image-slice: 100%; border-image-source: none; border-image-width: 1; bord=
er-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width:=
 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; border=
-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: non=
e; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Ar=
ial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; fo=
nt-style: normal; font-variant: normal; font-weight: 400; letter-spacing: n=
ormal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top:=
 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0p=
x; padding-top: 0px; text-align: left; text-decoration: none; text-indent: =
0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: nor=
mal; word-spacing: 0px;"><font face=3D"courier new,monospace" style=3D"bord=
er-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-=
width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-im=
age-slice: 100%; border-image-source: none; border-image-width: 1; border-l=
eft-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px=
; border-right-color: rgb(34, 34, 34); border-right-style: none; border-rig=
ht-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; b=
order-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0=
px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right:=
 0px; padding-top: 0px;">struct circle</font></div><div style=3D"background=
-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-st=
yle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-r=
epeat: stretch; border-image-slice: 100%; border-image-source: none; border=
-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: non=
e; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-righ=
t-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); =
border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font=
-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif=
; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 4=
00; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-ri=
ght: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0=
px; padding-right: 0px; padding-top: 0px; text-align: left; text-decoration=
: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: =
0px; white-space: normal; word-spacing: 0px;"><font face=3D"courier new,mon=
ospace" style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style:=
 none; border-bottom-width: 0px; border-image-outset: 0; border-image-repea=
t: stretch; border-image-slice: 100%; border-image-source: none; border-ima=
ge-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; b=
order-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-st=
yle: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bord=
er-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left:=
 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left=
: 0px; padding-right: 0px; padding-top: 0px;">{</font></div><div style=3D"b=
ackground-color: transparent; border-bottom-color: rgb(34, 34, 34); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(34, =
34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, =
34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,s=
ans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-=
weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; =
margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; paddin=
g-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-d=
ecoration: none; text-indent: 0px; text-transform: none; -webkit-text-strok=
e-width: 0px; white-space: normal; word-spacing: 0px;"><font face=3D"courie=
r new,monospace" style=3D"border-bottom-color: rgb(34, 34, 34); border-bott=
om-style: none; border-bottom-width: 0px; border-image-outset: 0; border-im=
age-repeat: stretch; border-image-slice: 100%; border-image-source: none; b=
order-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style=
: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border=
-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, =
34); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; mar=
gin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pad=
ding-left: 0px; padding-right: 0px; padding-top: 0px;">=C2=A0 <span style=
=3D"text-align: left; color: rgb(34, 34, 34); text-transform: none; text-in=
dent: 0px; letter-spacing: normal; font-size: 13px; font-style: normal; fon=
t-variant: normal; font-weight: 400; text-decoration: none; word-spacing: 0=
px; display: inline !important; white-space: normal; orphans: 2; float: non=
e; -webkit-text-stroke-width: 0px; background-color: transparent;">circle</=
span>(point p, size sz);</font></div><div style=3D"background-color: transp=
arent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bor=
der-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch=
; border-image-slice: 100%; border-image-source: none; border-image-width: =
1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-left=
-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none;=
 border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-sty=
le: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;=
quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 1=
3px; font-style: normal; font-variant: normal; font-weight: 400; letter-spa=
cing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; marg=
in-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-ri=
ght: 0px; padding-top: 0px; text-align: left; text-decoration: none; text-i=
ndent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-spa=
ce: normal; word-spacing: 0px;"><font style=3D"border-bottom-color: rgb(34,=
 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image=
-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-=
image-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 3=
4); border-left-style: none; border-left-width: 0px; border-right-color: rg=
b(34, 34, 34); border-right-style: none; border-right-width: 0px; border-to=
p-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"=
><span style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); bor=
der-image: none; text-align: left; color: rgb(34, 34, 34); text-transform: =
none; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-style=
: normal; font-variant: normal; font-weight: 400; text-decoration: none; wo=
rd-spacing: 0px; display: inline; white-space: normal; orphans: 2; float: n=
one; -webkit-text-stroke-width: 0px; background-color: transparent;"><font =
face=3D"courier new,monospace">=C2=A0 <span style=3D"text-align: left; colo=
r: rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing:=
 normal; font-size: 13px; font-style: normal; font-variant: normal; font-we=
ight: 400; text-decoration: none; word-spacing: 0px; display: inline !impor=
tant; white-space: normal; orphans: 2; float: none; -webkit-text-stroke-wid=
th: 0px; background-color: transparent;">circle</span>(case <span style=3D"=
margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-image: none;=
 text-align: left; color: rgb(34, 34, 34); text-transform: none; text-inden=
t: 0px; letter-spacing: normal; font-size: 13px; font-style: normal; font-v=
ariant: normal; font-weight: 400; text-decoration: none; word-spacing: 0px;=
 display: inline; white-space: normal; orphans: 2; float: none; -webkit-tex=
t-stroke-width: 0px; background-color: transparent;">bottomLeft</span>, poi=
nt p, size sz);</font></span><b style=3D"background: none; margin: 0px; pad=
ding: 0px; border: 0px rgb(34, 34, 34); border-image: none; height: auto; c=
olor: rgb(34, 34, 34); overflow: visible; font-size: 13px; overflow-x: visi=
ble; overflow-y: visible; min-width: 0px;"></b><i style=3D"background: none=
; margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-image: non=
e; height: auto; color: rgb(34, 34, 34); overflow: visible; font-size: 13px=
; overflow-x: visible; overflow-y: visible; min-width: 0px;"></i><u style=
=3D"background: none; margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34=
); border-image: none; height: auto; color: rgb(34, 34, 34); overflow: visi=
ble; font-size: 13px; overflow-x: visible; overflow-y: visible; min-width: =
0px;"></u><sub style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom=
-style: none; border-bottom-width: 0px; border-image-outset: 0; border-imag=
e-repeat: stretch; border-image-slice: 100%; border-image-source: none; bor=
der-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: =
none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-r=
ight-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34=
); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margi=
n-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddi=
ng-left: 0px; padding-right: 0px; padding-top: 0px;"></sub><sup style=3D"bo=
rder-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-botto=
m-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-=
image-slice: 100%; border-image-source: none; border-image-width: 1; border=
-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0=
px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-r=
ight-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none;=
 border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right:=
 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px;"></sup><strike style=3D"border-bottom-color: rgb(=
34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-im=
age-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bord=
er-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34=
, 34); border-left-style: none; border-left-width: 0px; border-right-color:=
 rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border=
-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px;=
 margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; =
padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0p=
x;"></strike><br style=3D"background: none; margin: 0px; padding: 0px; bord=
er: 0px rgb(34, 34, 34); border-image: none; height: auto; color: rgb(34, 3=
4, 34); overflow: visible; font-size: 13px; overflow-x: visible; overflow-y=
: visible; min-width: 0px;"></font></div><div style=3D"background-color: tr=
ansparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none;=
 border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: str=
etch; border-image-slice: 100%; border-image-source: none; border-image-wid=
th: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-=
left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: n=
one; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top=
-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &=
amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-siz=
e: 13px; font-style: normal; font-variant: normal; font-weight: 400; letter=
-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; =
margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; paddin=
g-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; te=
xt-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white=
-space: normal; word-spacing: 0px;"><font face=3D"courier new,monospace" st=
yle=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bor=
der-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch=
; border-image-slice: 100%; border-image-source: none; border-image-width: =
1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-left=
-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none;=
 border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-sty=
le: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px;">};</font></div><div style=3D"background=
-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-st=
yle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-r=
epeat: stretch; border-image-slice: 100%; border-image-source: none; border=
-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: non=
e; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-righ=
t-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); =
border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font=
-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif=
; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 4=
00; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-ri=
ght: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0=
px; padding-right: 0px; padding-top: 0px; text-align: left; text-decoration=
: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: =
0px; white-space: normal; word-spacing: 0px;"><font style=3D"border-bottom-=
color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px=
; border-image-outset: 0; border-image-repeat: stretch; border-image-slice:=
 100%; border-image-source: none; border-image-width: 1; border-left-color:=
 rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(34, 34, 34); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-=
width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;"><font face=3D"courier new,monospace"></font><br></font></div=
><div style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); bord=
er-image: none; text-align: left; color: rgb(34, 34, 34); text-transform: n=
one; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-varian=
t: normal; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text=
-stroke-width: 0px; background-color: transparent;"><font style=3D"border-b=
ottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-widt=
h: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-=
slice: 100%; border-image-source: none; border-image-width: 1; border-left-=
color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(34, 34, 34); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; borde=
r-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; =
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px=
; padding-top: 0px;"><span style=3D"text-align: left; color: rgb(34, 34, 34=
); text-transform: none; text-indent: 0px; letter-spacing: normal; font-siz=
e: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-d=
ecoration: none; word-spacing: 0px; display: inline !important; white-space=
: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; backgrou=
nd-color: transparent;"><font face=3D"courier new,monospace">case struct <s=
pan style=3D"text-align: left; color: rgb(34, 34, 34); text-transform: none=
; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-style: no=
rmal; font-variant: normal; font-weight: 400; text-decoration: none; word-s=
pacing: 0px; display: inline !important; white-space: normal; orphans: 2; f=
loat: none; -webkit-text-stroke-width: 0px; background-color: transparent;"=
>circle</span>;</font></span><b></b><i></i><u></u><sub></sub><sup></sup><st=
rike></strike><br></font></div><div style=3D"margin: 0px; padding: 0px; bor=
der: 0px rgb(34, 34, 34); border-image: none; text-align: left; color: rgb(=
34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: normal=
; font-size: 13px; font-variant: normal; word-spacing: 0px; white-space: no=
rmal; orphans: 2; -webkit-text-stroke-width: 0px; background-color: transpa=
rent;"><font style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-s=
tyle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-=
repeat: stretch; border-image-slice: 100%; border-image-source: none; borde=
r-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: no=
ne; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-rig=
ht-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34);=
 border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-=
left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding=
-left: 0px; padding-right: 0px; padding-top: 0px;"><span style=3D"margin: 0=
px; padding: 0px; border: 0px rgb(34, 34, 34); border-image: none; text-ali=
gn: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px; l=
etter-spacing: normal; font-size: 13px; font-style: normal; font-variant: n=
ormal; font-weight: 400; text-decoration: none; word-spacing: 0px; display:=
 inline; white-space: normal; orphans: 2; float: none; -webkit-text-stroke-=
width: 0px; background-color: transparent;"><font face=3D"courier new,monos=
pace">case struct <span style=3D"margin: 0px; padding: 0px; border: 0px rgb=
(34, 34, 34); border-image: none; text-align: left; color: rgb(34, 34, 34);=
 text-transform: none; text-indent: 0px; letter-spacing: normal; font-size:=
 13px; font-style: normal; font-variant: normal; font-weight: 400; text-dec=
oration: none; word-spacing: 0px; display: inline; white-space: normal; orp=
hans: 2; float: none; -webkit-text-stroke-width: 0px; background-color: tra=
nsparent;">rect</span>;</font></span><b style=3D"margin: 0px; padding: 0px;=
 border: 0px rgb(34, 34, 34); border-image: none; text-align: left; color: =
rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: no=
rmal; font-size: 13px; font-style: normal; font-variant: normal; font-weigh=
t: 700; text-decoration: none; word-spacing: 0px; white-space: normal; orph=
ans: 2; -webkit-text-stroke-width: 0px; background-color: transparent;"></b=
><i style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border=
-image: none; text-align: left; color: rgb(34, 34, 34); text-transform: non=
e; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-style: i=
talic; font-variant: normal; font-weight: 400; text-decoration: none; word-=
spacing: 0px; white-space: normal; orphans: 2; -webkit-text-stroke-width: 0=
px; background-color: transparent;"></i><u style=3D"margin: 0px; padding: 0=
px; border: 0px rgb(34, 34, 34); border-image: none; text-align: left; colo=
r: rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing:=
 normal; font-size: 13px; font-style: normal; font-variant: normal; font-we=
ight: 400; text-decoration: underline; word-spacing: 0px; white-space: norm=
al; orphans: 2; -webkit-text-stroke-width: 0px; background-color: transpare=
nt;"></u><sub style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 3=
4); border-image: none; text-align: left; color: rgb(34, 34, 34); text-tran=
sform: none; text-indent: 0px; letter-spacing: normal; font-size: 9px; font=
-style: normal; font-variant: normal; font-weight: 400; text-decoration: no=
ne; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-stroke=
-width: 0px; background-color: transparent;"></sub><sup style=3D"margin: 0p=
x; padding: 0px; border: 0px rgb(34, 34, 34); border-image: none; text-alig=
n: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px; le=
tter-spacing: normal; font-size: 9px; font-style: normal; font-variant: nor=
mal; font-weight: 400; text-decoration: none; word-spacing: 0px; white-spac=
e: normal; orphans: 2; -webkit-text-stroke-width: 0px; background-color: tr=
ansparent;"></sup><strike style=3D"margin: 0px; padding: 0px; border: 0px r=
gb(34, 34, 34); border-image: none; text-align: left; color: rgb(34, 34, 34=
); text-transform: none; text-indent: 0px; letter-spacing: normal; font-siz=
e: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-d=
ecoration: line-through; word-spacing: 0px; white-space: normal; orphans: 2=
; -webkit-text-stroke-width: 0px; background-color: transparent;"></strike>=
<b></b><i></i><u></u><sub></sub><sup></sup><strike></strike></font></div><d=
iv style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-=
image: none; text-align: left; color: rgb(34, 34, 34); text-transform: none=
; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-variant: =
normal; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-st=
roke-width: 0px; background-color: transparent;"><font style=3D"border-bott=
om-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: =
0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sli=
ce: 100%; border-image-source: none; border-image-width: 1; border-left-col=
or: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; borde=
r-right-color: rgb(34, 34, 34); border-right-style: none; border-right-widt=
h: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-t=
op-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; mar=
gin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; p=
adding-top: 0px;"><font face=3D"courier new,monospace"></font><br></font></=
div><div style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); b=
order-image: none; text-align: left; color: rgb(34, 34, 34); text-transform=
: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-var=
iant: normal; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-t=
ext-stroke-width: 0px; background-color: transparent;"><font style=3D"borde=
r-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-w=
idth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-ima=
ge-slice: 100%; border-image-source: none; border-image-width: 1; border-le=
ft-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px;=
 border-right-color: rgb(34, 34, 34); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bo=
rder-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0p=
x; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: =
0px; padding-top: 0px;"><div style=3D"background-color: transparent; border=
-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-wi=
dth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-imag=
e-slice: 100%; border-image-source: none; border-image-width: 1; border-lef=
t-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; =
border-right-color: rgb(34, 34, 34); border-right-style: none; border-right=
-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bor=
der-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&am=
p;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-sty=
le: normal; font-variant: normal; font-weight: 400; letter-spacing: normal;=
 margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; =
orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; pad=
ding-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; t=
ext-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; w=
ord-spacing: 0px;"><font face=3D"courier new,monospace" style=3D"border-bot=
tom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width:=
 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sl=
ice: 100%; border-image-source: none; border-image-width: 1; border-left-co=
lor: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bord=
er-right-color: rgb(34, 34, 34); border-right-style: none; border-right-wid=
th: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-=
top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; ma=
rgin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; =
padding-top: 0px;">struct shape</font></div><div style=3D"background-color:=
 transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: no=
ne; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: =
stretch; border-image-slice: 100%; border-image-source: none; border-image-=
width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bord=
er-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style=
: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-=
top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family=
: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-=
size: 13px; font-style: normal; font-variant: normal; font-weight: 400; let=
ter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0p=
x; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px; text-align: left; text-decoration: none;=
 text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; wh=
ite-space: normal; word-spacing: 0px;"><font face=3D"courier new,monospace"=
 style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; =
border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stre=
tch; border-image-slice: 100%; border-image-source: none; border-image-widt=
h: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: no=
ne; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-=
style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px;">{</font></div><div style=3D"backgrou=
nd-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-=
style: none; border-bottom-width: 0px; border-image-outset: 0; border-image=
-repeat: stretch; border-image-slice: 100%; border-image-source: none; bord=
er-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: n=
one; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-ri=
ght-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34)=
; border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); fo=
nt-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-ser=
if; font-size: 13px; font-style: normal; font-variant: normal; font-weight:=
 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left:=
 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decorati=
on: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width=
: 0px; white-space: normal; word-spacing: 0px;"><font face=3D"courier new,m=
onospace" style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-styl=
e: none; border-bottom-width: 0px; border-image-outset: 0; border-image-rep=
eat: stretch; border-image-slice: 100%; border-image-source: none; border-i=
mage-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none;=
 border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-=
style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bo=
rder-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-lef=
t: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px;">=C2=A0 template&lt;class...=
 Args&gt;</font></div><div style=3D"background-color: transparent; border-b=
ottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-widt=
h: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-=
slice: 100%; border-image-source: none; border-image-width: 1; border-left-=
color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(34, 34, 34); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; borde=
r-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;=
quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style=
: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; m=
argin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; or=
phans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddi=
ng-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; tex=
t-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; wor=
d-spacing: 0px;"><font face=3D"courier new,monospace" style=3D"border-botto=
m-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0=
px; border-image-outset: 0; border-image-repeat: stretch; border-image-slic=
e: 100%; border-image-source: none; border-image-width: 1; border-left-colo=
r: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border=
-right-color: rgb(34, 34, 34); border-right-style: none; border-right-width=
: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-to=
p-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; marg=
in-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; pa=
dding-top: 0px;">=C2=A0 <span style=3D"text-align: left; color: rgb(34, 34,=
 34); text-transform: none; text-indent: 0px; letter-spacing: normal; font-=
size: 13px; font-style: normal; font-variant: normal; font-weight: 400; tex=
t-decoration: none; word-spacing: 0px; display: inline !important; white-sp=
ace: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; backg=
round-color: transparent;">shape</span>(case circle, Args&amp;&amp;...); <i=
>//&lt; &quot;in-place&quot; construct a circle as shape</i></font><font st=
yle=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bor=
der-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch=
; border-image-slice: 100%; border-image-source: none; border-image-width: =
1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-left=
-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none;=
 border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-sty=
le: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px;"><br></font></div><div style=3D"backgrou=
nd-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-=
style: none; border-bottom-width: 0px; border-image-outset: 0; border-image=
-repeat: stretch; border-image-slice: 100%; border-image-source: none; bord=
er-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: n=
one; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-ri=
ght-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34)=
; border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); fo=
nt-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-ser=
if; font-size: 13px; font-style: normal; font-variant: normal; font-weight:=
 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left:=
 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decorati=
on: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width=
: 0px; white-space: normal; word-spacing: 0px;"><font face=3D"courier new,m=
onospace" style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-styl=
e: none; border-bottom-width: 0px; border-image-outset: 0; border-image-rep=
eat: stretch; border-image-slice: 100%; border-image-source: none; border-i=
mage-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none;=
 border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-=
style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bo=
rder-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-lef=
t: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px;">=C2=A0 <span style=3D"text-=
align: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px=
; letter-spacing: normal; font-size: 13px; font-style: normal; font-variant=
: normal; font-weight: 400; text-decoration: none; word-spacing: 0px; displ=
ay: inline !important; white-space: normal; orphans: 2; float: none; -webki=
t-text-stroke-width: 0px; background-color: transparent;">shape</span>(<spa=
n style=3D"text-align: left; color: rgb(34, 34, 34); text-transform: none; =
text-indent: 0px; letter-spacing: normal; font-size: 13px; font-style: norm=
al; font-variant: normal; font-weight: 400; text-decoration: none; word-spa=
cing: 0px; display: inline !important; white-space: normal; orphans: 2; flo=
at: none; -webkit-text-stroke-width: 0px; background-color: transparent;">c=
ircle</span>, color);=C2=A0 <i>//&lt; </i><span style=3D"display: inline !i=
mportant; float: none; background-color: transparent; color: rgb(34, 34, 34=
); font-family: courier new,monospace; font-size: 13px; font-style: normal;=
 font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2=
; text-align: left; text-decoration: none; text-indent: 0px; text-transform=
: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: =
0px;">from object of type circle</span></font></div><div style=3D"backgroun=
d-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-s=
tyle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-=
repeat: stretch; border-image-slice: 100%; border-image-source: none; borde=
r-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: no=
ne; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-rig=
ht-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34);=
 border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); fon=
t-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-seri=
f; font-size: 13px; font-style: normal; font-variant: normal; font-weight: =
400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-r=
ight: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: =
0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decoratio=
n: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width:=
 0px; white-space: normal; word-spacing: 0px;"><b></b><i></i><u></u><sub></=
sub><sup></sup><strike></strike><br></div><div style=3D"background-color: t=
ransparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none=
; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: st=
retch; border-image-slice: 100%; border-image-source: none; border-image-wi=
dth: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border=
-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: =
none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-to=
p-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: =
&amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-si=
ze: 13px; font-style: normal; font-variant: normal; font-weight: 400; lette=
r-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
 margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; t=
ext-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; whit=
e-space: normal; word-spacing: 0px;"><font style=3D"border-bottom-color: rg=
b(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-=
image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bo=
rder-image-source: none; border-image-width: 1; border-left-color: rgb(34, =
34, 34); border-left-style: none; border-left-width: 0px; border-right-colo=
r: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bord=
er-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0p=
x; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px=
; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: =
0px;"><font face=3D"courier new,monospace" style=3D"border-bottom-color: rg=
b(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-=
image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bo=
rder-image-source: none; border-image-width: 1; border-left-color: rgb(34, =
34, 34); border-left-style: none; border-left-width: 0px; border-right-colo=
r: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bord=
er-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0p=
x; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px=
; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: =
0px;">=C2=A0 template&lt;class... Args&gt;</font></font></div><div style=3D=
"background-color: transparent; border-bottom-color: rgb(34, 34, 34); borde=
r-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bor=
der-image-repeat: stretch; border-image-slice: 100%; border-image-source: n=
one; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left=
-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(34=
, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34=
, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;=
,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; fon=
t-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px=
; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padd=
ing-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text=
-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-str=
oke-width: 0px; white-space: normal; word-spacing: 0px;"><font style=3D"bor=
der-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-slice: 100%; border-image-source: none; border-image-width: 1; border-=
left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0p=
x; border-right-color: rgb(34, 34, 34); border-right-style: none; border-ri=
ght-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; =
border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: =
0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right=
: 0px; padding-top: 0px;"><div style=3D"margin: 0px; padding: 0px; border: =
0px rgb(34, 34, 34); border-image: none; text-align: left; color: rgb(34, 3=
4, 34); text-transform: none; text-indent: 0px; letter-spacing: normal; fon=
t-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; t=
ext-decoration: none; word-spacing: 0px; white-space: normal; orphans: 2; -=
webkit-text-stroke-width: 0px; background-color: transparent;"><font face=
=3D"courier new,monospace" style=3D"border-bottom-color: rgb(34, 34, 34); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
 border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-=
left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 3=
4); border-right-style: none; border-right-width: 0px; border-top-color: rg=
b(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom=
: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom=
: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=C2=A0 <sp=
an style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-=
image: none; text-align: left; color: rgb(34, 34, 34); text-transform: none=
; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-style: no=
rmal; font-variant: normal; font-weight: 400; text-decoration: none; word-s=
pacing: 0px; display: inline; white-space: normal; orphans: 2; float: none;=
 -webkit-text-stroke-width: 0px; background-color: transparent;">shape</spa=
n>(case rect, Args&amp;&amp;...); <i>//&lt; </i><i>&quot;in-place&quot; </i=
><font style=3D"background-color: transparent; border-bottom-color: rgb(34,=
 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image=
-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-=
image-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 3=
4); border-left-style: none; border-left-width: 0px; border-right-color: rg=
b(34, 34, 34); border-right-style: none; border-right-width: 0px; border-to=
p-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; co=
lor: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helv=
etica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-varia=
nt: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; m=
argin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bo=
ttom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-al=
ign: left; text-decoration: none; text-indent: 0px; text-transform: none; -=
webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"></f=
ont><i>overload for rect</i></font><font style=3D"border-bottom-color: rgb(=
34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-im=
age-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bord=
er-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34=
, 34); border-left-style: none; border-left-width: 0px; border-right-color:=
 rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border=
-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px;=
 margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; =
padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0p=
x;"></font></div></font></div><div style=3D"background-color: transparent; =
border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bot=
tom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; borde=
r-image-slice: 100%; border-image-source: none; border-image-width: 1; bord=
er-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width:=
 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; border=
-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: non=
e; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Ar=
ial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; fo=
nt-style: normal; font-variant: normal; font-weight: 400; letter-spacing: n=
ormal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top:=
 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0p=
x; padding-top: 0px; text-align: left; text-decoration: none; text-indent: =
0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: nor=
mal; word-spacing: 0px;"><font face=3D"courier new,monospace" style=3D"bord=
er-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-=
width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-im=
age-slice: 100%; border-image-source: none; border-image-width: 1; border-l=
eft-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px=
; border-right-color: rgb(34, 34, 34); border-right-style: none; border-rig=
ht-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; b=
order-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0=
px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right:=
 0px; padding-top: 0px;">};</font></div><div><b></b><i></i><u></u><sub></su=
b><sup></sup><strike></strike><font face=3D"courier new,monospace"></font><=
br></div><div><font face=3D"courier new,monospace">// usage highlights</fon=
t></div><div><font face=3D"courier new,monospace"></font><br></div><div><sp=
an style=3D"display: inline !important; float: none; background-color: tran=
sparent; color: rgb(34, 34, 34); font-family: courier new,monospace; font-s=
ize: 13px; font-style: normal; font-variant: normal; font-weight: 400; lett=
er-spacing: normal; orphans: 2; text-align: left; text-decoration: none; te=
xt-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white=
-space: normal; word-spacing: 0px;">const auto circle =3D mycircle();</span=
><br></div></font></div><b></b><i></i><u></u><sub></sub><sup></sup><strike>=
</strike><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><font =
face=3D"courier new,monospace">shape(circle, red); //&lt; as usual, from ob=
ject of type circle</font><br></div><div><br></div><div><span style=3D"text=
-align: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0p=
x; letter-spacing: normal; font-size: 13px; font-style: normal; font-varian=
t: normal; font-weight: 400; text-decoration: none; word-spacing: 0px; disp=
lay: inline !important; white-space: normal; orphans: 2; float: none; -webk=
it-text-stroke-width: 0px; background-color: transparent;"><font face=3D"co=
urier new,monospace">shape(circle: <span style=3D"margin: 0px; padding: 0px=
; border: 0px rgb(34, 34, 34); border-image: none; text-align: left; color:=
 rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: n=
ormal; font-size: 13px; font-style: normal; font-variant: normal; font-weig=
ht: 400; text-decoration: none; word-spacing: 0px; display: inline; white-s=
pace: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; back=
ground-color: transparent;">bottomLeft: </span>p, sz); <i>//&lt; calling im=
plicit &quot;named constructor&quot; for circle - impossible with static fu=
nctions!</i></font></span></div><div><span style=3D"text-align: left; color=
: rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: =
normal; font-size: 13px; font-style: normal; font-variant: normal; font-wei=
ght: 400; text-decoration: none; word-spacing: 0px; display: inline !import=
ant; white-space: normal; orphans: 2; float: none; -webkit-text-stroke-widt=
h: 0px; background-color: transparent;"><font face=3D"courier new,monospace=
"><i></i><br></font></span></div><div><span style=3D"text-align: left; colo=
r: rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing:=
 normal; font-size: 13px; font-variant: normal; word-spacing: 0px; display:=
 inline !important; white-space: normal; orphans: 2; float: none; -webkit-t=
ext-stroke-width: 0px; background-color: transparent;"><font face=3D"courie=
r new,monospace"><span style=3D"display: inline !important; float: none; ba=
ckground-color: transparent; color: rgb(34, 34, 34); font-family: courier n=
ew,monospace; font-size: 13px; font-style: normal; font-variant: normal; fo=
nt-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-=
decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stro=
ke-width: 0px; white-space: normal; word-spacing: 0px;">auto sh =3D std::ma=
ke_shared&lt;shape&gt;(circle: p, sz</span><span style=3D"display: inline !=
important; float: none; background-color: transparent; color: rgb(34, 34, 3=
4); font-family: courier new,monospace; font-size: 13px; font-style: normal=
; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: =
2; text-align: left; text-decoration: none; text-indent: 0px; text-transfor=
m: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing:=
 0px;">); <i>//&lt; yep, it works - the label is not part of the name of th=
e function!</i></span><br></font></span></div><div><br></div><div><font fac=
e=3D"arial,sans-serif">Also note, we can build any shape using SFINAE.</fon=
t></div><div><font face=3D"arial,sans-serif"><br></font></div><div><font fa=
ce=3D"arial,sans-serif"><br></font></div><div><font face=3D"arial,sans-seri=
f">The usefulness of this idiom is by no means limited to constructors.</fo=
nt></div><div><font face=3D"arial,sans-serif"><br></font></div><div><font f=
ace=3D"arial,sans-serif">We can imagine</font></div><div><font face=3D"aria=
l,sans-serif"><br></font></div><div><span style=3D"text-align: left; color:=
 rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: n=
ormal; font-size: 13px; font-style: normal; font-variant: normal; font-weig=
ht: 400; text-decoration: none; word-spacing: 0px; display: inline !importa=
nt; white-space: normal; orphans: 2; float: none; -webkit-text-stroke-width=
: 0px; background-color: transparent;"><font face=3D"courier new,monospace"=
>write(Data);</font></span><b></b><i></i><u></u><sub></sub><sup></sup><stri=
ke></strike><br></div><div><font face=3D"courier new,monospace">write(case =
noCommit, Data);</font></div><div><font face=3D"courier new,monospace"><br>=
</font></div><div><font face=3D"arial,sans-serif">This is more then valuabl=
e alternative to any of the current methods - a bool argument, an enum argu=
ment or a different function name.=C2=A0</font></div><div><font face=3D"ari=
al,sans-serif">For a real word example one should look no further then para=
llel stl.</font><br></div><div><font face=3D"courier new,monospace"></font>=
<br></div><div>Lets return to constructors</div><div><div style=3D"backgrou=
nd-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-=
style: none; border-bottom-width: 0px; border-image-outset: 0; border-image=
-repeat: stretch; border-image-slice: 100%; border-image-source: none; bord=
er-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: n=
one; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-ri=
ght-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34)=
; border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); fo=
nt-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-ser=
if; font-size: 13px; font-style: normal; font-variant: normal; font-weight:=
 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left:=
 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decorati=
on: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width=
: 0px; white-space: normal; word-spacing: 0px;"><span style=3D"background-c=
olor: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-styl=
e: none; border-bottom-width: 0px; border-image-outset: 0; border-image-rep=
eat: stretch; border-image-slice: 100%; border-image-source: none; border-i=
mage-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none;=
 border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-=
style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bo=
rder-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); displa=
y: inline; float: none; font-family: arial,sans-serif; font-size: 13px; fon=
t-style: normal; font-variant: normal; font-weight: 400; letter-spacing: no=
rmal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: =
0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px=
; padding-top: 0px; text-align: left; text-decoration: none; text-indent: 0=
px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: norm=
al; word-spacing: 0px;"><br style=3D"border-bottom-color: rgb(34, 34, 34); =
border-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0=
; border-image-repeat: stretch; border-image-slice: 100%; border-image-sour=
ce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border=
-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, =
34); border-right-style: none; border-right-width: 0px; border-top-color: r=
gb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-botto=
m: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></span></=
div><div style=3D"background-color: transparent; border-bottom-color: rgb(3=
4, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34,=
 34); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; =
color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;He=
lvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-var=
iant: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px;=
 margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-=
bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-=
align: left; text-decoration: none; text-indent: 0px; text-transform: none;=
 -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><=
span style=3D"background-color: transparent; border-bottom-color: rgb(34, 3=
4, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-o=
utset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-im=
age-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34)=
; border-left-style: none; border-left-width: 0px; border-right-color: rgb(=
34, 34, 34); border-right-style: none; border-right-width: 0px; border-top-=
color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; colo=
r: rgb(34, 34, 34); display: inline; float: none; font-family: arial,sans-s=
erif; font-size: 13px; font-style: normal; font-variant: normal; font-weigh=
t: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margi=
n-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decora=
tion: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-wid=
th: 0px; white-space: normal; word-spacing: 0px;"><span style=3D"background=
-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-st=
yle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-r=
epeat: stretch; border-image-slice: 100%; border-image-source: none; border=
-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: non=
e; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-righ=
t-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); =
border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); disp=
lay: inline; float: none; font-family: arial,sans-serif; font-size: 13px; f=
ont-style: normal; font-variant: normal; font-weight: 400; letter-spacing: =
normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top=
: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0=
px; padding-top: 0px; text-align: left; text-decoration: none; text-indent:=
 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: no=
rmal; word-spacing: 0px;">Label arguments are transparent to the type syste=
m once bound to a typename.</span></span><span style=3D"background-color: t=
ransparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none=
; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: st=
retch; border-image-slice: 100%; border-image-source: none; border-image-wi=
dth: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border=
-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: =
none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-to=
p-style: none; border-top-width: 0px; color: rgb(34, 34, 34); display: inli=
ne; float: none; font-family: arial,sans-serif; font-size: 13px; font-style=
: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; m=
argin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; or=
phans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddi=
ng-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; tex=
t-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; wor=
d-spacing: 0px;"><br style=3D"border-bottom-color: rgb(34, 34, 34); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(34, =
34, 34); border-top-style: none; border-top-width: 0px; margin-bottom: 0px;=
 margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px;=
 padding-left: 0px; padding-right: 0px; padding-top: 0px;"></span></div></d=
iv><div><div style=3D"background-color: transparent; border-bottom-color: r=
gb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border=
-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; b=
order-image-source: none; border-image-width: 1; border-left-color: rgb(34,=
 34, 34); border-left-style: none; border-left-width: 0px; border-right-col=
or: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bor=
der-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0=
px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quo=
t;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font=
-variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom: =
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padd=
ing-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; t=
ext-align: left; text-decoration: none; text-indent: 0px; text-transform: n=
one; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px=
;"><span style=3D"background-color: transparent; border-bottom-color: rgb(3=
4, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34,=
 34); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; =
color: rgb(34, 34, 34); display: inline; float: none; font-family: arial,sa=
ns-serif; font-size: 13px; font-style: normal; font-variant: normal; font-w=
eight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding=
-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-de=
coration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke=
-width: 0px; white-space: normal; word-spacing: 0px;">As a result template =
argument deduction just works, again, something <i>impossible</i> with stat=
ic functions.=C2=A0</span><b style=3D"background-attachment: scroll; backgr=
ound-clip: border-box; background-color: transparent; background-image: non=
e; background-origin: padding-box; background-position-x: 0%; background-po=
sition-y: 0%; background-repeat: repeat; background-size: auto; border-bott=
om-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: =
0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sli=
ce: 100%; border-image-source: none; border-image-width: 1; border-left-col=
or: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; borde=
r-right-color: rgb(34, 34, 34); border-right-style: none; border-right-widt=
h: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-t=
op-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quo=
t;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; height: auto;=
 margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; =
min-width: 0px; overflow: visible; overflow-x: visible; overflow-y: visible=
; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: =
0px;"></b><i style=3D"background-attachment: scroll; background-clip: borde=
r-box; background-color: transparent; background-image: none; background-or=
igin: padding-box; background-position-x: 0%; background-position-y: 0%; ba=
ckground-repeat: repeat; background-size: auto; border-bottom-color: rgb(34=
, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-imag=
e-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border=
-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34, =
34); border-left-style: none; border-left-width: 0px; border-right-color: r=
gb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-t=
op-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; c=
olor: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Hel=
vetica&amp;quot;,sans-serif; font-size: 13px; height: auto; margin-bottom: =
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; =
overflow: visible; overflow-x: visible; overflow-y: visible; padding-bottom=
: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></i><u sty=
le=3D"background-attachment: scroll; background-clip: border-box; backgroun=
d-color: transparent; background-image: none; background-origin: padding-bo=
x; background-position-x: 0%; background-position-y: 0%; background-repeat:=
 repeat; background-size: auto; border-bottom-color: rgb(34, 34, 34); borde=
r-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bor=
der-image-repeat: stretch; border-image-slice: 100%; border-image-source: n=
one; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left=
-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(34=
, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34=
, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;=
,sans-serif; font-size: 13px; height: auto; margin-bottom: 0px; margin-left=
: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visibl=
e; overflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-l=
eft: 0px; padding-right: 0px; padding-top: 0px;"></u><sub style=3D"border-b=
ottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-widt=
h: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-=
slice: 100%; border-image-source: none; border-image-width: 1; border-left-=
color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(34, 34, 34); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; borde=
r-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; =
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px=
; padding-top: 0px;"></sub><sup style=3D"border-bottom-color: rgb(34, 34, 3=
4); border-bottom-style: none; border-bottom-width: 0px; border-image-outse=
t: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-=
source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bo=
rder-left-style: none; border-left-width: 0px; border-right-color: rgb(34, =
34, 34); border-right-style: none; border-right-width: 0px; border-top-colo=
r: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-b=
ottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-b=
ottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></sup=
><strike style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style=
: none; border-bottom-width: 0px; border-image-outset: 0; border-image-repe=
at: stretch; border-image-slice: 100%; border-image-source: none; border-im=
age-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; =
border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-s=
tyle: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bor=
der-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left=
: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px;"></strike></div><b></b><i></i=
><u></u><sub></sub><sup></sup><strike></strike><br></div><font face=3D"cour=
ier new,monospace">template&lt;class T&gt;<br>struct rect<br>{ <br>=C2=A0 t=
emplate&lt;LabelArg StartPoint, Point2D Pos, Size2D Size&gt;<br>=C2=A0 rect=
(StartPoint, Pos, Size) {}<br>=C2=A0 T x,y,w,h;<br>}<br><br>  template&lt;L=
abelArg StartPoint, Point2D Pos, Size2D Size&gt;<br></font><div><font face=
=3D"courier new,monospace">rect(StartPoint, Pos, Size) -&gt; rect&lt;best_t=
ype_t&lt;<span style=3D"display: inline !important; float: none; background=
-color: transparent; color: rgb(34, 34, 34); font-family: courier new,monos=
pace; font-size: 13px; font-style: normal; font-variant: normal; font-weigh=
t: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decorati=
on: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width=
: 0px; white-space: normal; word-spacing: 0px;">StartPoint, </span>storage_=
t&lt;Pos&gt;, storage_t&lt;Size&gt;&gt;&gt;;=C2=A0</font></div><div><br></d=
iv><div><font face=3D"courier new,monospace">// user</font></div><div><font=
 face=3D"courier new,monospace"></font><br></div><div><font face=3D"courier=
 new,monospace">rect(center: floatPoint{}, intSize{12,12}); <i>//&lt; rect&=
lt;best_type&gt;</i></font></div><div><font face=3D"courier new,monospace">=
<i><br></i></font></div><div><div style=3D"background-color: transparent; b=
order-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bott=
om-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border=
-image-slice: 100%; border-image-source: none; border-image-width: 1; borde=
r-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: =
0px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-=
right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none=
; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Ari=
al&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; fon=
t-style: normal; font-variant: normal; font-weight: 400; letter-spacing: no=
rmal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: =
0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px=
; padding-top: 0px; text-align: left; text-decoration: none; text-indent: 0=
px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: norm=
al; word-spacing: 0px;"><font face=3D"arial,sans-serif"></font><br style=3D=
"background-attachment: scroll; background-clip: border-box; background-col=
or: transparent; background-image: none; background-origin: padding-box; ba=
ckground-position-x: 0%; background-position-y: 0%; background-repeat: repe=
at; background-size: auto; border-bottom-color: rgb(34, 34, 34); border-bot=
tom-style: none; border-bottom-width: 0px; border-image-outset: 0; border-i=
mage-repeat: stretch; border-image-slice: 100%; border-image-source: none; =
border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-styl=
e: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); borde=
r-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34,=
 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34)=
; font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans=
-serif; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px=
; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible; ov=
erflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: =
0px; padding-right: 0px; padding-top: 0px;"></div><div style=3D"background-=
color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-sty=
le: none; border-bottom-width: 0px; border-image-outset: 0; border-image-re=
peat: stretch; border-image-slice: 100%; border-image-source: none; border-=
image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none=
; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right=
-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); b=
order-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-=
family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif;=
 font-size: 13px; font-style: normal; font-variant: normal; font-weight: 40=
0; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-rig=
ht: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0p=
x; padding-right: 0px; padding-top: 0px; text-align: left; text-decoration:=
 none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0=
px; white-space: normal; word-spacing: 0px;"><font face=3D"arial,sans-serif=
">Lastly, lets=C2=A0 look at <font face=3D"courier new,monospace">std::allo=
cator_arg</font></font><font face=3D"arial,sans-serif"> again.=C2=A0</font>=
</div><div style=3D"background-color: transparent; border-bottom-color: rgb=
(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-i=
mage-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bor=
der-image-source: none; border-image-width: 1; border-left-color: rgb(34, 3=
4, 34); border-left-style: none; border-left-width: 0px; border-right-color=
: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; borde=
r-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px=
; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;=
Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-v=
ariant: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0p=
x; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; paddin=
g-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; tex=
t-align: left; text-decoration: none; text-indent: 0px; text-transform: non=
e; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"=
><font face=3D"arial,sans-serif">With proper tag support inviting new &quot=
;descriptive&quot; names is not needed</font></div><font face=3D"courier ne=
w,monospace"><div style=3D"background-color: transparent; border-bottom-col=
or: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; b=
order-image-outset: 0; border-image-repeat: stretch; border-image-slice: 10=
0%; border-image-source: none; border-image-width: 1; border-left-color: rg=
b(34, 34, 34); border-left-style: none; border-left-width: 0px; border-righ=
t-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px=
; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-wid=
th: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&am=
p;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal;=
 font-variant: normal; font-weight: 400; letter-spacing: normal; margin-bot=
tom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2;=
 padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0=
px; text-align: left; text-decoration: none; text-indent: 0px; text-transfo=
rm: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing=
: 0px;"><font face=3D"arial,sans-serif"></font><font face=3D"arial,sans-ser=
if"></font><br style=3D"background-attachment: scroll; background-clip: bor=
der-box; background-color: transparent; background-image: none; background-=
origin: padding-box; background-position-x: 0%; background-position-y: 0%; =
background-repeat: repeat; background-size: auto; border-bottom-color: rgb(=
34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-im=
age-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bord=
er-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34=
, 34); border-left-style: none; border-left-width: 0px; border-right-color:=
 rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border=
-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px;=
 color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;H=
elvetica&amp;quot;,sans-serif; font-size: 13px; height: auto; margin-bottom=
: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px=
; overflow: visible; overflow-x: visible; overflow-y: visible; padding-bott=
om: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></div><d=
iv style=3D"background-color: transparent; border-bottom-color: rgb(34, 34,=
 34); border-bottom-style: none; border-bottom-width: 0px; border-image-out=
set: 0; border-image-repeat: stretch; border-image-slice: 100%; border-imag=
e-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); =
border-left-style: none; border-left-width: 0px; border-right-color: rgb(34=
, 34, 34); border-right-style: none; border-right-width: 0px; border-top-co=
lor: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color:=
 rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetic=
a&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: =
normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margi=
n-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom=
: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align:=
 left; text-decoration: none; text-indent: 0px; text-transform: none; -webk=
it-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><font f=
ace=3D"courier new,monospace" style=3D"border-bottom-color: rgb(34, 34, 34)=
; border-bottom-style: none; border-bottom-width: 0px; border-image-outset:=
 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-so=
urce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bord=
er-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34=
, 34); border-right-style: none; border-right-width: 0px; border-top-color:=
 rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bot=
tom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bot=
tom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">namespa=
ce std {</font></div><div style=3D"background-color: transparent; border-bo=
ttom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width=
: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-s=
lice: 100%; border-image-source: none; border-image-width: 1; border-left-c=
olor: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bor=
der-right-color: rgb(34, 34, 34); border-right-style: none; border-right-wi=
dth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border=
-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;q=
uot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style:=
 normal; font-variant: normal; font-weight: 400; letter-spacing: normal; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orp=
hans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; text=
-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word=
-spacing: 0px;"><font face=3D"courier new,monospace" style=3D"border-bottom=
-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0p=
x; border-image-outset: 0; border-image-repeat: stretch; border-image-slice=
: 100%; border-image-source: none; border-image-width: 1; border-left-color=
: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-=
right-color: rgb(34, 34, 34); border-right-style: none; border-right-width:=
 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top=
-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margi=
n-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; pad=
ding-top: 0px;">case struct=C2=A0<span style=3D"background-color: transpare=
nt; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border=
-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; b=
order-image-slice: 100%; border-image-source: none; border-image-width: 1; =
border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bo=
rder-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style:=
 none; border-top-width: 0px; color: rgb(34, 34, 34); display: inline; floa=
t: none; font-size: 13px; font-style: normal; font-variant: normal; font-we=
ight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; ma=
rgin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-=
left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-dec=
oration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-=
width: 0px; white-space: normal; word-spacing: 0px;">allocator;</span></fon=
t></div><div style=3D"background-color: transparent; border-bottom-color: r=
gb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border=
-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; b=
order-image-source: none; border-image-width: 1; border-left-color: rgb(34,=
 34, 34); border-left-style: none; border-left-width: 0px; border-right-col=
or: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bor=
der-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0=
px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quo=
t;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font=
-variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom: =
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padd=
ing-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; t=
ext-align: left; text-decoration: none; text-indent: 0px; text-transform: n=
one; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px=
;"><span style=3D"background-color: transparent; border-bottom-color: rgb(3=
4, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34,=
 34); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; =
color: rgb(34, 34, 34); display: inline; float: none; font-size: 13px; font=
-style: normal; font-variant: normal; font-weight: 400; letter-spacing: nor=
mal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0=
px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px;=
 padding-top: 0px; text-align: left; text-decoration: none; text-indent: 0p=
x; text-transform: none; -webkit-text-stroke-width: 0px; white-space: norma=
l; word-spacing: 0px;"><font face=3D"courier new,monospace" style=3D"border=
-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-wi=
dth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-imag=
e-slice: 100%; border-image-source: none; border-image-width: 1; border-lef=
t-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; =
border-right-color: rgb(34, 34, 34); border-right-style: none; border-right=
-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bor=
der-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px=
; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0=
px; padding-top: 0px;">}</font></span></div><div style=3D"background-color:=
 transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: no=
ne; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: =
stretch; border-image-slice: 100%; border-image-source: none; border-image-=
width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bord=
er-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style=
: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-=
top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family=
: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-=
size: 13px; font-style: normal; font-variant: normal; font-weight: 400; let=
ter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0p=
x; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px; text-align: left; text-decoration: none;=
 text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; wh=
ite-space: normal; word-spacing: 0px;"><b style=3D"background-attachment: s=
croll; background-clip: border-box; background-color: transparent; backgrou=
nd-image: none; background-origin: padding-box; background-position-x: 0%; =
background-position-y: 0%; background-repeat: repeat; background-size: auto=
; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-b=
ottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bor=
der-image-slice: 100%; border-image-source: none; border-image-width: 1; bo=
rder-left-color: rgb(34, 34, 34); border-left-style: none; border-left-widt=
h: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bord=
er-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: n=
one; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;=
Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; =
height: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; marg=
in-top: 0px; min-width: 0px; overflow: visible; overflow-x: visible; overfl=
ow-y: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; =
padding-top: 0px;"></b><i style=3D"background-attachment: scroll; backgroun=
d-clip: border-box; background-color: transparent; background-image: none; =
background-origin: padding-box; background-position-x: 0%; background-posit=
ion-y: 0%; background-repeat: repeat; background-size: auto; border-bottom-=
color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px=
; border-image-outset: 0; border-image-repeat: stretch; border-image-slice:=
 100%; border-image-source: none; border-image-width: 1; border-left-color:=
 rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(34, 34, 34); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-=
width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,=
&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; height: auto; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min=
-width: 0px; overflow: visible; overflow-x: visible; overflow-y: visible; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
;"></i><u style=3D"background-attachment: scroll; background-clip: border-b=
ox; background-color: transparent; background-image: none; background-origi=
n: padding-box; background-position-x: 0%; background-position-y: 0%; backg=
round-repeat: repeat; background-size: auto; border-bottom-color: rgb(34, 3=
4, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-o=
utset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-im=
age-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34)=
; border-left-style: none; border-left-width: 0px; border-right-color: rgb(=
34, 34, 34); border-right-style: none; border-right-width: 0px; border-top-=
color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; colo=
r: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvet=
ica&amp;quot;,sans-serif; font-size: 13px; height: auto; margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; ove=
rflow: visible; overflow-x: visible; overflow-y: visible; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></u><sub styl=
e=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; borde=
r-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; =
border-image-slice: 100%; border-image-source: none; border-image-width: 1;=
 border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-w=
idth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; b=
order-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style=
: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin=
-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px;"></sub><sup style=3D"border-bottom-color: =
rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; borde=
r-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; =
border-image-source: none; border-image-width: 1; border-left-color: rgb(34=
, 34, 34); border-left-style: none; border-left-width: 0px; border-right-co=
lor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bo=
rder-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: =
0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0=
px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top=
: 0px;"></sup><strike style=3D"border-bottom-color: rgb(34, 34, 34); border=
-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bord=
er-image-repeat: stretch; border-image-slice: 100%; border-image-source: no=
ne; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); b=
order-right-style: none; border-right-width: 0px; border-top-color: rgb(34,=
 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px=
; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></strike><b sty=
le=3D"background-attachment: scroll; background-clip: border-box; backgroun=
d-color: transparent; background-image: none; background-origin: padding-bo=
x; background-position-x: 0%; background-position-y: 0%; background-repeat:=
 repeat; background-size: auto; border-bottom-color: rgb(34, 34, 34); borde=
r-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bor=
der-image-repeat: stretch; border-image-slice: 100%; border-image-source: n=
one; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left=
-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(34=
, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34=
, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;=
,sans-serif; font-size: 13px; height: auto; margin-bottom: 0px; margin-left=
: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visibl=
e; overflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-l=
eft: 0px; padding-right: 0px; padding-top: 0px;"></b><i style=3D"background=
-attachment: scroll; background-clip: border-box; background-color: transpa=
rent; background-image: none; background-origin: padding-box; background-po=
sition-x: 0%; background-position-y: 0%; background-repeat: repeat; backgro=
und-size: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bo=
rder-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-sty=
le: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); borde=
r-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-fami=
ly: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; fon=
t-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; margin-ri=
ght: 0px; margin-top: 0px; min-width: 0px; overflow: visible; overflow-x: v=
isible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; paddin=
g-right: 0px; padding-top: 0px;"></i><u style=3D"background-attachment: scr=
oll; background-clip: border-box; background-color: transparent; background=
-image: none; background-origin: padding-box; background-position-x: 0%; ba=
ckground-position-y: 0%; background-repeat: repeat; background-size: auto; =
border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bot=
tom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; borde=
r-image-slice: 100%; border-image-source: none; border-image-width: 1; bord=
er-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width:=
 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; border=
-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: non=
e; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Ar=
ial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; he=
ight: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; min-width: 0px; overflow: visible; overflow-x: visible; overflow=
-y: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; pa=
dding-top: 0px;"></u><sub style=3D"border-bottom-color: rgb(34, 34, 34); bo=
rder-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; =
border-image-repeat: stretch; border-image-slice: 100%; border-image-source=
: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-l=
eft-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom:=
 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom:=
 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></sub><sup =
style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; b=
order-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stret=
ch; border-image-slice: 100%; border-image-source: none; border-image-width=
: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-le=
ft-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: non=
e; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-s=
tyle: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; ma=
rgin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; p=
adding-right: 0px; padding-top: 0px;"></sup><strike style=3D"border-bottom-=
color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px=
; border-image-outset: 0; border-image-repeat: stretch; border-image-slice:=
 100%; border-image-source: none; border-image-width: 1; border-left-color:=
 rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(34, 34, 34); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-=
width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;"></strike><font face=3D"courier new,monospace" style=3D"borde=
r-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-w=
idth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-ima=
ge-slice: 100%; border-image-source: none; border-image-width: 1; border-le=
ft-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px;=
 border-right-color: rgb(34, 34, 34); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bo=
rder-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0p=
x; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: =
0px; padding-top: 0px;"></font><br style=3D"background-attachment: scroll; =
background-clip: border-box; background-color: transparent; background-imag=
e: none; background-origin: padding-box; background-position-x: 0%; backgro=
und-position-y: 0%; background-repeat: repeat; background-size: auto; borde=
r-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-w=
idth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-ima=
ge-slice: 100%; border-image-source: none; border-image-width: 1; border-le=
ft-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px;=
 border-right-color: rgb(34, 34, 34); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bo=
rder-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&a=
mp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; height:=
 auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top:=
 0px; min-width: 0px; overflow: visible; overflow-x: visible; overflow-y: v=
isible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px;"></div><div style=3D"background-color: transparent; border-botto=
m-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0=
px; border-image-outset: 0; border-image-repeat: stretch; border-image-slic=
e: 100%; border-image-source: none; border-image-width: 1; border-left-colo=
r: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border=
-right-color: rgb(34, 34, 34); border-right-style: none; border-right-width=
: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-to=
p-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot=
;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: no=
rmal; font-variant: normal; font-weight: 400; letter-spacing: normal; margi=
n-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphan=
s: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-t=
op: 0px; text-align: left; text-decoration: none; text-indent: 0px; text-tr=
ansform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-sp=
acing: 0px;"><font face=3D"courier new,monospace" style=3D"border-bottom-co=
lor: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; =
border-image-outset: 0; border-image-repeat: stretch; border-image-slice: 1=
00%; border-image-source: none; border-image-width: 1; border-left-color: r=
gb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-rig=
ht-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0p=
x; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-wi=
dth: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px;">// user=C2=A0</font></div><div style=3D"background-color: tran=
sparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; b=
order-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stret=
ch; border-image-slice: 100%; border-image-source: none; border-image-width=
: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-le=
ft-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: non=
e; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-s=
tyle: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &am=
p;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size:=
 13px; font-style: normal; font-variant: normal; font-weight: 400; letter-s=
pacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; ma=
rgin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-=
right: 0px; padding-top: 0px; text-align: left; text-decoration: none; text=
-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-s=
pace: normal; word-spacing: 0px;"><font face=3D"courier new,monospace" styl=
e=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; borde=
r-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; =
border-image-slice: 100%; border-image-source: none; border-image-width: 1;=
 border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-w=
idth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; b=
order-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style=
: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin=
-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px;"><br style=3D"background-attachment: scrol=
l; background-clip: border-box; background-color: transparent; background-i=
mage: none; background-origin: padding-box; background-position-x: 0%; back=
ground-position-y: 0%; background-repeat: repeat; background-size: auto; bo=
rder-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-botto=
m-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-=
image-slice: 100%; border-image-source: none; border-image-width: 1; border=
-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0=
px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-r=
ight-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none;=
 border-top-width: 0px; color: rgb(34, 34, 34); font-family: courier new,mo=
nospace; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0p=
x; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible; o=
verflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left:=
 0px; padding-right: 0px; padding-top: 0px;"></font></div><div style=3D"bac=
kground-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bo=
ttom-style: none; border-bottom-width: 0px; border-image-outset: 0; border-=
image-repeat: stretch; border-image-slice: 100%; border-image-source: none;=
 border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-sty=
le: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bord=
er-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34=
, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34=
); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,san=
s-serif; font-size: 13px; font-style: normal; font-variant: normal; font-we=
ight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; ma=
rgin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-=
left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-dec=
oration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-=
width: 0px; white-space: normal; word-spacing: 0px;"><font face=3D"courier =
new,monospace" style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom=
-style: none; border-bottom-width: 0px; border-image-outset: 0; border-imag=
e-repeat: stretch; border-image-slice: 100%; border-image-source: none; bor=
der-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: =
none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-r=
ight-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34=
); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margi=
n-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddi=
ng-left: 0px; padding-right: 0px; padding-top: 0px;"><span style=3D"backgro=
und-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom=
-style: none; border-bottom-width: 0px; border-image-outset: 0; border-imag=
e-repeat: stretch; border-image-slice: 100%; border-image-source: none; bor=
der-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: =
none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-r=
ight-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34=
); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); d=
isplay: inline; float: none; font-family: courier new,monospace; font-size:=
 13px; font-style: normal; font-variant: normal; font-weight: 400; letter-s=
pacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; ma=
rgin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-=
right: 0px; padding-top: 0px; text-align: left; text-decoration: none; text=
-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-s=
pace: normal; word-spacing: 0px;">using namespace std; //&lt; just to highl=
ight the lack of collision</span></font></div><div style=3D"background-colo=
r: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bo=
rder-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-sty=
le: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); borde=
r-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-fami=
ly: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; fon=
t-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; l=
etter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: =
0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; p=
adding-right: 0px; padding-top: 0px; text-align: left; text-decoration: non=
e; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; =
white-space: normal; word-spacing: 0px;"><font face=3D"courier new,monospac=
e" style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none=
; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: st=
retch; border-image-slice: 100%; border-image-source: none; border-image-wi=
dth: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border=
-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: =
none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-to=
p-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px;=
 margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px=
; padding-right: 0px; padding-top: 0px;">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 // note that it is incorrect as t=
he user must be able to tell, a std::<span style=3D"background-color: trans=
parent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bo=
rder-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretc=
h; border-image-slice: 100%; border-image-source: none; border-image-width:=
 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-lef=
t-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none=
; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-st=
yle: none; border-top-width: 0px; color: rgb(34, 34, 34); display: inline; =
float: none; font-family: courier new,monospace; font-size: 13px; font-styl=
e: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; =
margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; o=
rphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; te=
xt-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; wo=
rd-spacing: 0px;">allocator</span> label is required.=C2=A0</font><br style=
=3D"background-attachment: scroll; background-clip: border-box; background-=
color: transparent; background-image: none; background-origin: padding-box;=
 background-position-x: 0%; background-position-y: 0%; background-repeat: r=
epeat; background-size: auto; border-bottom-color: rgb(34, 34, 34); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(34, =
34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, =
34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,s=
ans-serif; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: =
0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible;=
 overflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px;"></div><div style=3D"backgrou=
nd-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-=
style: none; border-bottom-width: 0px; border-image-outset: 0; border-image=
-repeat: stretch; border-image-slice: 100%; border-image-source: none; bord=
er-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: n=
one; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-ri=
ght-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34)=
; border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); fo=
nt-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-ser=
if; font-size: 13px; font-style: normal; font-variant: normal; font-weight:=
 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left:=
 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decorati=
on: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width=
: 0px; white-space: normal; word-spacing: 0px;"><font face=3D"courier new,m=
onospace" style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-styl=
e: none; border-bottom-width: 0px; border-image-outset: 0; border-image-rep=
eat: stretch; border-image-slice: 100%; border-image-source: none; border-i=
mage-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none;=
 border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-=
style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bo=
rder-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-lef=
t: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px;"></font><b style=3D"backgrou=
nd-attachment: scroll; background-clip: border-box; background-color: trans=
parent; background-image: none; background-origin: padding-box; background-=
position-x: 0%; background-position-y: 0%; background-repeat: repeat; backg=
round-size: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-style=
: none; border-bottom-width: 0px; border-image-outset: 0; border-image-repe=
at: stretch; border-image-slice: 100%; border-image-source: none; border-im=
age-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; =
border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-s=
tyle: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bor=
der-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-fa=
mily: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; f=
ont-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; min-width: 0px; overflow: visible; overflow-x:=
 visible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; padd=
ing-right: 0px; padding-top: 0px;"></b><i style=3D"background-attachment: s=
croll; background-clip: border-box; background-color: transparent; backgrou=
nd-image: none; background-origin: padding-box; background-position-x: 0%; =
background-position-y: 0%; background-repeat: repeat; background-size: auto=
; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-b=
ottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bor=
der-image-slice: 100%; border-image-source: none; border-image-width: 1; bo=
rder-left-color: rgb(34, 34, 34); border-left-style: none; border-left-widt=
h: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bord=
er-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: n=
one; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;=
Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; =
height: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; marg=
in-top: 0px; min-width: 0px; overflow: visible; overflow-x: visible; overfl=
ow-y: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; =
padding-top: 0px;"></i><u style=3D"background-attachment: scroll; backgroun=
d-clip: border-box; background-color: transparent; background-image: none; =
background-origin: padding-box; background-position-x: 0%; background-posit=
ion-y: 0%; background-repeat: repeat; background-size: auto; border-bottom-=
color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px=
; border-image-outset: 0; border-image-repeat: stretch; border-image-slice:=
 100%; border-image-source: none; border-image-width: 1; border-left-color:=
 rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(34, 34, 34); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-=
width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,=
&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; height: auto; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min=
-width: 0px; overflow: visible; overflow-x: visible; overflow-y: visible; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
;"></u><sub style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-st=
yle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-r=
epeat: stretch; border-image-slice: 100%; border-image-source: none; border=
-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: non=
e; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-righ=
t-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); =
border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-l=
eft: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-=
left: 0px; padding-right: 0px; padding-top: 0px;"></sub><sup style=3D"borde=
r-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-w=
idth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-ima=
ge-slice: 100%; border-image-source: none; border-image-width: 1; border-le=
ft-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px;=
 border-right-color: rgb(34, 34, 34); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bo=
rder-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0p=
x; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: =
0px; padding-top: 0px;"></sup><strike style=3D"border-bottom-color: rgb(34,=
 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image=
-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-=
image-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 3=
4); border-left-style: none; border-left-width: 0px; border-right-color: rg=
b(34, 34, 34); border-right-style: none; border-right-width: 0px; border-to=
p-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"=
></strike><br style=3D"background-attachment: scroll; background-clip: bord=
er-box; background-color: transparent; background-image: none; background-o=
rigin: padding-box; background-position-x: 0%; background-position-y: 0%; b=
ackground-repeat: repeat; background-size: auto; border-bottom-color: rgb(3=
4, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34,=
 34); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; =
color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;He=
lvetica&amp;quot;,sans-serif; font-size: 13px; height: auto; margin-bottom:=
 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px;=
 overflow: visible; overflow-x: visible; overflow-y: visible; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></div><di=
v style=3D"background-color: transparent; border-bottom-color: rgb(34, 34, =
34); border-bottom-style: none; border-bottom-width: 0px; border-image-outs=
et: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image=
-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); b=
order-left-style: none; border-left-width: 0px; border-right-color: rgb(34,=
 34, 34); border-right-style: none; border-right-width: 0px; border-top-col=
or: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: =
rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica=
&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: n=
ormal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin=
-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom:=
 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: =
left; text-decoration: none; text-indent: 0px; text-transform: none; -webki=
t-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><font fa=
ce=3D"courier new,monospace" style=3D"border-bottom-color: rgb(34, 34, 34);=
 border-bottom-style: none; border-bottom-width: 0px; border-image-outset: =
0; border-image-repeat: stretch; border-image-slice: 100%; border-image-sou=
rce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); borde=
r-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34,=
 34); border-right-style: none; border-right-width: 0px; border-top-color: =
rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bott=
om: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bott=
om: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">template=
&lt;Allocator allocator&gt;</font></div><div style=3D"background-color: tra=
nsparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; =
border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stre=
tch; border-image-slice: 100%; border-image-source: none; border-image-widt=
h: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: no=
ne; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-=
style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &a=
mp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size=
: 13px; font-style: normal; font-variant: normal; font-weight: 400; letter-=
spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; m=
argin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding=
-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; tex=
t-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-=
space: normal; word-spacing: 0px;"><font face=3D"courier new,monospace" sty=
le=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bord=
er-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch;=
 border-image-slice: 100%; border-image-source: none; border-image-width: 1=
; border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-=
width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; =
border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-styl=
e: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margi=
n-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padd=
ing-right: 0px; padding-top: 0px;">object(. . ., case allocator, allocator =
alloc);</font></div><div style=3D"background-color: transparent; border-bot=
tom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width:=
 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sl=
ice: 100%; border-image-source: none; border-image-width: 1; border-left-co=
lor: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bord=
er-right-color: rgb(34, 34, 34); border-right-style: none; border-right-wid=
th: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-=
top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;qu=
ot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: =
normal; font-variant: normal; font-weight: 400; letter-spacing: normal; mar=
gin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orph=
ans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; text-=
transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-=
spacing: 0px;"><font face=3D"courier new,monospace" style=3D"border-bottom-=
color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px=
; border-image-outset: 0; border-image-repeat: stretch; border-image-slice:=
 100%; border-image-source: none; border-image-width: 1; border-left-color:=
 rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(34, 34, 34); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-=
width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;"><br style=3D"background-attachment: scroll; background-clip:=
 border-box; background-color: transparent; background-image: none; backgro=
und-origin: padding-box; background-position-x: 0%; background-position-y: =
0%; background-repeat: repeat; background-size: auto; border-bottom-color: =
rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; borde=
r-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; =
border-image-source: none; border-image-width: 1; border-left-color: rgb(34=
, 34, 34); border-left-style: none; border-left-width: 0px; border-right-co=
lor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bo=
rder-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: =
0px; color: rgb(34, 34, 34); font-family: courier new,monospace; font-size:=
 13px; height: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0p=
x; margin-top: 0px; min-width: 0px; overflow: visible; overflow-x: visible;=
 overflow-y: visible; padding-bottom: 0px; padding-left: 0px; padding-right=
: 0px; padding-top: 0px;"></font></div><div style=3D"background-color: tran=
sparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; b=
order-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stret=
ch; border-image-slice: 100%; border-image-source: none; border-image-width=
: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-le=
ft-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: non=
e; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-s=
tyle: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &am=
p;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size:=
 13px; font-style: normal; font-variant: normal; font-weight: 400; letter-s=
pacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; ma=
rgin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-=
right: 0px; padding-top: 0px; text-align: left; text-decoration: none; text=
-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-s=
pace: normal; word-spacing: 0px;"><font face=3D"courier new,monospace" styl=
e=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; borde=
r-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; =
border-image-slice: 100%; border-image-source: none; border-image-width: 1;=
 border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-w=
idth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; b=
order-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style=
: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin=
-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px;">// invoke</font></div><div style=3D"backg=
round-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bott=
om-style: none; border-bottom-width: 0px; border-image-outset: 0; border-im=
age-repeat: stretch; border-image-slice: 100%; border-image-source: none; b=
order-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style=
: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border=
-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, =
34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34);=
 font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-=
serif; font-size: 13px; font-style: normal; font-variant: normal; font-weig=
ht: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decor=
ation: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-wi=
dth: 0px; white-space: normal; word-spacing: 0px;"><font face=3D"courier ne=
w,monospace" style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-s=
tyle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-=
repeat: stretch; border-image-slice: 100%; border-image-source: none; borde=
r-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: no=
ne; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-rig=
ht-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34);=
 border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-=
left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding=
-left: 0px; padding-right: 0px; padding-top: 0px;"><br style=3D"background-=
attachment: scroll; background-clip: border-box; background-color: transpar=
ent; background-image: none; background-origin: padding-box; background-pos=
ition-x: 0%; background-position-y: 0%; background-repeat: repeat; backgrou=
nd-size: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-style: n=
one; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat:=
 stretch; border-image-slice: 100%; border-image-source: none; border-image=
-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bor=
der-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-styl=
e: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border=
-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-famil=
y: courier new,monospace; font-size: 13px; height: auto; margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; ove=
rflow: visible; overflow-x: visible; overflow-y: visible; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></font></div>=
</font><div style=3D"background-color: transparent; border-bottom-color: rg=
b(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-=
image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bo=
rder-image-source: none; border-image-width: 1; border-left-color: rgb(34, =
34, 34); border-left-style: none; border-left-width: 0px; border-right-colo=
r: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bord=
er-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0p=
x; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot=
;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-=
variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0=
px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; paddi=
ng-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; te=
xt-align: left; text-decoration: none; text-indent: 0px; text-transform: no=
ne; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;=
"><font face=3D"courier new,monospace"><font face=3D"courier new,monospace"=
 style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; =
border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stre=
tch; border-image-slice: 100%; border-image-source: none; border-image-widt=
h: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: no=
ne; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-=
style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px;">object(. . ., <span style=3D"backgro=
und-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom=
-style: none; border-bottom-width: 0px; border-image-outset: 0; border-imag=
e-repeat: stretch; border-image-slice: 100%; border-image-source: none; bor=
der-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: =
none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-r=
ight-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34=
); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); d=
isplay: inline; float: none; font-family: courier new,monospace; font-size:=
 13px; font-style: normal; font-variant: normal; font-weight: 400; letter-s=
pacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; ma=
rgin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-=
right: 0px; padding-top: 0px; text-align: left; text-decoration: none; text=
-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-s=
pace: normal; word-spacing: 0px;">std::allocator: MyAllocator{}</span>);</f=
ont></font></div><div style=3D"background-color: transparent; border-bottom=
-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0p=
x; border-image-outset: 0; border-image-repeat: stretch; border-image-slice=
: 100%; border-image-source: none; border-image-width: 1; border-left-color=
: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-=
right-color: rgb(34, 34, 34); border-right-style: none; border-right-width:=
 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top=
-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;=
,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: nor=
mal; font-variant: normal; font-weight: 400; letter-spacing: normal; margin=
-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans=
: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-to=
p: 0px; text-align: left; text-decoration: none; text-indent: 0px; text-tra=
nsform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spa=
cing: 0px;"><br></div></div><div><font face=3D"arial,sans-serif"></font><br=
></div><div><span style=3D"display: inline !important; float: none; backgro=
und-color: transparent; color: rgb(34, 34, 34); font-family: &quot;Arial&qu=
ot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: normal; =
font-variant: normal; font-weight: 700; letter-spacing: normal; orphans: 2;=
 text-align: left; text-decoration: none; text-indent: 0px; text-transform:=
 none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0=
px;">Part 2: Details</span><b></b><i></i><u></u><sub></sub><sup></sup><stri=
ke></strike><br></div><div><font face=3D"arial,sans-serif"><b></b><i></i><u=
></u><sub></sub><sup></sup><strike></strike><br></font></div><div><font fac=
e=3D"arial,sans-serif">Lets break it all down.</font></div><div><font face=
=3D"arial,sans-serif"><br></font></div><div><font face=3D"arial,sans-serif"=
><br></font></div><div><font face=3D"arial,sans-serif">Labels are declared-=
and-defined simply by prepending </font><font face=3D"courier new,monospace=
">case</font><font face=3D"arial,sans-serif"> to (possibly templated) <font=
 face=3D"courier new,monospace">class</font> or <font face=3D"courier new,m=
onospace">struct</font> declaration.=C2=A0</font><br></div><div><font face=
=3D"arial,sans-serif"><br></font></div><div><font face=3D"courier new,monos=
pace">case struct center;</font><br></div><div><font face=3D"courier new,mo=
nospace"><br></font></div><div><font face=3D"arial,sans-serif">This will cr=
eate <i>roughly</i> the equivalent code, in the enclosing scope =C2=A0</fon=
t></div><div><font face=3D"arial,sans-serif"><br></font></div><div><font fa=
ce=3D"courier new,monospace">label_scope <i>//&lt; name is just for illustr=
ation, the compiler picks the name</i></font></div><div><font face=3D"couri=
er new,monospace">{</font></div><div><font face=3D"courier new,monospace">=
=C2=A0=C2=A0<span style=3D"text-align: left; color: rgb(34, 34, 34); text-t=
ransform: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; =
font-style: normal; font-variant: normal; font-weight: 400; text-decoration=
: none; word-spacing: 0px; display: inline !important; white-space: normal;=
 orphans: 2; float: none; -webkit-text-stroke-width: 0px; background-color:=
 transparent;">struct center { /*explicit ctor, spaceship or whatever*/=C2=
=A0 };</span></font></div><div><span style=3D"text-align: left; color: rgb(=
34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: normal=
; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 4=
00; text-decoration: none; word-spacing: 0px; display: inline !important; w=
hite-space: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px=
; background-color: transparent;"><font face=3D"courier new,monospace">=C2=
=A0 <span style=3D"text-align: left; color: rgb(34, 34, 34); text-transform=
: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-sty=
le: normal; font-variant: normal; font-weight: 400; text-decoration: none; =
word-spacing: 0px; display: inline !important; white-space: normal; orphans=
: 2; float: none; -webkit-text-stroke-width: 0px; background-color: transpa=
rent;">inline static constexpr auto <span style=3D"text-align: left; color:=
 rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: n=
ormal; font-size: 13px; font-style: normal; font-variant: normal; font-weig=
ht: 400; text-decoration: none; word-spacing: 0px; display: inline !importa=
nt; white-space: normal; orphans: 2; float: none; -webkit-text-stroke-width=
: 0px; background-color: transparent;">center_v </span>=3D <span style=3D"b=
ackground-color: transparent; border-bottom-color: rgb(34, 34, 34); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(34, =
34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, =
34); display: inline; float: none; font-family: courier new,monospace; font=
-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; le=
tter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0=
px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; pa=
dding-right: 0px; padding-top: 0px; text-align: left; text-decoration: none=
; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; w=
hite-space: normal; word-spacing: 0px;">center</span>();</span>=C2=A0</font=
></span></div><div><font face=3D"courier new,monospace">}</font></div><div>=
<div style=3D"background-color: transparent; border-bottom-color: rgb(34, 3=
4, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-o=
utset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-im=
age-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34)=
; border-left-style: none; border-left-width: 0px; border-right-color: rgb(=
34, 34, 34); border-right-style: none; border-right-width: 0px; border-top-=
color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; colo=
r: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvet=
ica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant=
: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; mar=
gin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bott=
om: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-alig=
n: left; text-decoration: none; text-indent: 0px; text-transform: none; -we=
bkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><font=
 style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; =
border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stre=
tch; border-image-slice: 100%; border-image-source: none; border-image-widt=
h: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: no=
ne; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-=
style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px;"></font></div><b></b><i></i><u></u><s=
ub></sub><sup></sup><strike></strike><font face=3D"courier new,monospace"><=
/font><br></div><div><span style=3D"display: inline !important; float: none=
; background-color: transparent; color: rgb(34, 34, 34); font-family: couri=
er new,monospace; font-size: 13px; font-style: normal; font-variant: normal=
; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; t=
ext-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-=
stroke-width: 0px; white-space: normal; word-spacing: 0px;">label_scope</sp=
an> is implementation defined, but it should probably be either a class, if=
 the enclosing scope is a class, or a namespace, if the enclosing scope is =
a namespace.</div><div><br></div><div>In any case this scope <i>should neve=
r collide with any other namespace (or class)</i> even if this means a sepa=
rate name for every TU. The name will <i>never</i> be visible and it is pur=
ely implementation detail.</div><div><br></div><div>At this point we have a=
 type and a constant that are invisible for the rest of the typesystem, whi=
ch is, as we saw, what we need.</div><div><br></div><div>To bring the type =
into scope, one must use <font face=3D"courier new,monospace">case</font><f=
ont face=3D"arial,sans-serif"> before its name. This will </font>prepend <f=
ont face=3D"arial,sans-serif">the hidden scope name to the type name.</font=
></div><div><font face=3D"courier new,monospace"></font><br></div><div><fon=
t face=3D"courier new,monospace">case center =3D=3D=C2=A0<span style=3D"tex=
t-align: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0=
px; letter-spacing: normal; font-size: 13px; font-style: normal; font-varia=
nt: normal; font-weight: 400; text-decoration: none; word-spacing: 0px; dis=
play: inline !important; white-space: normal; orphans: 2; float: none; -web=
kit-text-stroke-width: 0px; background-color: transparent;">label_scope::ce=
nter</span></font></div><div><font face=3D"courier new,monospace"><span sty=
le=3D"text-align: left; color: rgb(34, 34, 34); text-transform: none; text-=
indent: 0px; letter-spacing: normal; font-size: 13px; font-style: normal; f=
ont-variant: normal; font-weight: 400; text-decoration: none; word-spacing:=
 0px; display: inline !important; white-space: normal; orphans: 2; float: n=
one; -webkit-text-stroke-width: 0px; background-color: transparent;"><br></=
span></font></div><div><font face=3D"courier new,monospace">case std::alloc=
ator =3D=3D=C2=A0<span style=3D"display: inline !important; float: none; ba=
ckground-color: transparent; color: rgb(34, 34, 34); font-family: courier n=
ew,monospace; font-size: 13px; font-style: normal; font-variant: normal; fo=
nt-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-=
decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stro=
ke-width: 0px; white-space: normal; word-spacing: 0px;">std::<span style=3D=
"background-color: transparent; border-bottom-color: rgb(34, 34, 34); borde=
r-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bor=
der-image-repeat: stretch; border-image-slice: 100%; border-image-source: n=
one; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left=
-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(34=
, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34=
, 34); display: inline; float: none; font-family: courier new,monospace; fo=
nt-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; =
letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right:=
 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px; text-align: left; text-decoration: no=
ne; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px;=
 white-space: normal; word-spacing: 0px;">label_scope::</span>allocator</sp=
an></font></div><div><span style=3D"text-align: left; color: rgb(34, 34, 34=
); text-transform: none; text-indent: 0px; letter-spacing: normal; font-siz=
e: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-d=
ecoration: none; word-spacing: 0px; display: inline !important; white-space=
: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; backgrou=
nd-color: transparent;"><font face=3D"arial,sans-serif"></font><br></span><=
/div><div><span style=3D"text-align: left; color: rgb(34, 34, 34); text-tra=
nsform: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; fo=
nt-style: normal; font-variant: normal; font-weight: 400; text-decoration: =
none; word-spacing: 0px; display: inline !important; white-space: normal; o=
rphans: 2; float: none; -webkit-text-stroke-width: 0px; background-color: t=
ransparent;"><font face=3D"arial,sans-serif">Used in this way, the label be=
comes a regular type name and can be used in any place type is required=C2=
=A0</font></span></div><div><span style=3D"text-align: left; color: rgb(34,=
 34, 34); text-transform: none; text-indent: 0px; letter-spacing: normal; f=
ont-size: 13px; font-style: normal; font-variant: normal; font-weight: 400;=
 text-decoration: none; word-spacing: 0px; display: inline !important; whit=
e-space: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; b=
ackground-color: transparent;"><font face=3D"arial,sans-serif"><br></font><=
/span></div><div><span style=3D"text-align: left; color: rgb(34, 34, 34); t=
ext-transform: none; text-indent: 0px; letter-spacing: normal; font-size: 1=
3px; font-variant: normal; word-spacing: 0px; display: inline !important; w=
hite-space: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px=
; background-color: transparent;"><font face=3D"arial,sans-serif"><span sty=
le=3D"display: inline !important; float: none; background-color: transparen=
t; color: rgb(34, 34, 34); font-family: courier new,monospace; font-size: 1=
3px; font-style: normal; font-variant: normal; font-weight: 400; letter-spa=
cing: normal; orphans: 2; text-align: left; text-decoration: none; text-ind=
ent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space=
: normal; word-spacing: 0px;">void (*)(case center, point, size);</span><b>=
</b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></font></span>=
</div><div><span style=3D"text-align: left; color: rgb(34, 34, 34); text-tr=
ansform: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; f=
ont-style: normal; font-variant: normal; font-weight: 400; text-decoration:=
 none; word-spacing: 0px; display: inline !important; white-space: normal; =
orphans: 2; float: none; -webkit-text-stroke-width: 0px; background-color: =
transparent;"><font face=3D"courier new,monospace">std::is_same&lt;case cen=
ter, <span style=3D"display: inline !important; float: none; background-col=
or: transparent; color: rgb(34, 34, 34); font-family: courier new,monospace=
; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 4=
00; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: =
none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0p=
x; white-space: normal; word-spacing: 0px;">case foo::center</span>&gt;_v;<=
/font></span></div><div><span style=3D"text-align: left; color: rgb(34, 34,=
 34); text-transform: none; text-indent: 0px; letter-spacing: normal; font-=
size: 13px; font-style: normal; font-variant: normal; font-weight: 400; tex=
t-decoration: none; word-spacing: 0px; display: inline !important; white-sp=
ace: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; backg=
round-color: transparent;"><font face=3D"courier new,monospace"><br></font>=
</span></div><div><span style=3D"text-align: left; color: rgb(34, 34, 34); =
text-transform: none; text-indent: 0px; letter-spacing: normal; font-size: =
13px; font-style: normal; font-variant: normal; font-weight: 400; text-deco=
ration: none; word-spacing: 0px; display: inline !important; white-space: n=
ormal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; background-=
color: transparent;"><font face=3D"courier new,monospace">constexpr auto c =
=3D case circle{};</font></span><br></div><div><font face=3D"courier new,mo=
nospace">using T =3D case circle; <i>// or even &quot;<span style=3D"text-a=
lign: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px;=
 letter-spacing: normal; font-family: courier new,monospace; font-size: 13p=
x; font-variant: normal; font-weight: 400; text-decoration: none; word-spac=
ing: 0px; display: inline !important; white-space: normal; orphans: 2; floa=
t: none; -webkit-text-stroke-width: 0px; background-color: transparent;">us=
ing circle =3D case circle;&quot;</span></i></font><br></div><div><b></b><i=
></i><u></u><sub></sub><sup></sup><strike></strike><br></div><div>Other the=
n the type, we also need the constant.=C2=A0</div><div><br></div><blockquot=
e class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1=
ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-l=
eft-style: solid;">Although we could simply create instances of the label t=
ype, this is far from perfect and not what the established practice is curr=
ently.</blockquote><div><br></div><div>To get the <span style=3D"display: i=
nline !important; float: none; background-color: transparent; color: rgb(34=
, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif;=
 font-size: 13px; font-style: normal; font-variant: normal; font-weight: 40=
0; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: n=
one; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px=
; white-space: normal; word-spacing: 0px;">constant </span>we append colon =
(<font face=3D"courier new,monospace">:</font>) to its name.</div><div><fon=
t face=3D"courier new,monospace"><br></font></div><div><font face=3D"arial,=
sans-serif">This will first append the hidden scope, then instead of the ty=
pe, it will fetch the constant:</font></div><div><font face=3D"courier new,=
monospace"><font face=3D"arial,sans-serif"></font><br></font></div><div><fo=
nt face=3D"courier new,monospace"><span style=3D"display: inline !important=
; float: none; background-color: transparent; color: rgb(34, 34, 34); font-=
family: courier new,monospace; font-size: 13px; font-style: normal; font-va=
riant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-a=
lign: left; text-decoration: none; text-indent: 0px; text-transform: none; =
-webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">ci=
rcle: =3D=3D label_scope::circle_v</span><br></font></div><div><font face=
=3D"courier new,monospace"><b></b><i></i><u></u><sub></sub><sup></sup><stri=
ke></strike><br></font></div><div><font face=3D"arial,sans-serif"><i>Howeve=
r</i>, because the need for the constant is limited to only 3 cases -=C2=A0=
 a function call, to take its address and to declare it as default argument=
,=C2=A0</font></div><div><font face=3D"arial,sans-serif">I suggest to allow=
 the syntax <i>only in the first case</i> - to call a function.</font>=C2=
=A0</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin: =
0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204)=
; border-left-width: 1px; border-left-style: solid;">Default labels will al=
ways look awkward, besides, one can still construct{} it.=C2=A0</blockquote=
><div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex;=
 padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-widt=
h: 1px; border-left-style: solid;">Taking the address, for whatever reason,=
 can be done using std::<span style=3D"text-align: left; color: rgb(0, 0, 0=
); text-transform: none; line-height: 14.08px; text-indent: 0px; letter-spa=
cing: normal; font-size: 12.8px; font-style: normal; font-variant: normal; =
font-weight: 400; text-decoration: none; word-spacing: 0px; display: inline=
 !important; white-space: nowrap; orphans: 2; float: none; -webkit-text-str=
oke-width: 0px; background-color: transparent;">addressof, <font face=3D"ar=
ial,sans-serif">which itself is a function.</font></span></blockquote></div=
><div><span class=3D"br0" style=3D"background-color: transparent; color: rg=
b(0, 128, 0); font-family: DejaVuSansMono,&amp;quot;DejaVu Sans Mono&amp;qu=
ot;,courier,monospace; font-size: 12.8px; font-style: normal; font-variant:=
 normal; font-weight: 400; letter-spacing: normal; line-height: 14.08px; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orp=
hans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; text=
-transform: none; -webkit-text-stroke-width: 0px; white-space: nowrap; word=
-spacing: 0px;"></span><br></div><div>This restriction prevents us from col=
lision with any C labels and from funky code like <font face=3D"courier new=
,monospace">&amp;circle:;</font></div><div><font face=3D"courier new,monosp=
ace"><br></font></div><div><blockquote class=3D"gmail_quote" style=3D"margi=
n: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 2=
04); border-left-width: 1px; border-left-style: solid;">The syntax <font fa=
ce=3D"courier new,monospace">case label:</font> is not allowed as it is not=
 needed and makes it easier to prevent any collision with switch statement =
labels.</blockquote></div><div><font face=3D"courier new,monospace"><br></f=
ont></div><div><font face=3D"arial,sans-serif">There are two more pieces le=
ft.=C2=A0</font></div><div><font face=3D"arial,sans-serif"><br></font></div=
><div><font face=3D"arial,sans-serif"><b>The first one</b>, is to allow the=
 comma after a label to be omitted.</font></div><div><font face=3D"arial,sa=
ns-serif">This means that both of these are the same</font></div><div><font=
 face=3D"arial,sans-serif"><br></font></div><div><font face=3D"courier new,=
monospace">shape(circle:, r, a);</font></div><div><font face=3D"arial,sans-=
serif"></font><br></div><div><font face=3D"courier new,monospace">shape(cir=
cle: r, a);</font></div><div><font face=3D"courier new,monospace"><br></fon=
t></div><div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px=
 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-le=
ft-width: 1px; border-left-style: solid;">This &quot;quirk&quot; can be som=
ething positive as this will aid teaching the fact, labels are just argumen=
ts.=C2=A0</blockquote></div><div><blockquote class=3D"gmail_quote" style=3D=
"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, =
204, 204); border-left-width: 1px; border-left-style: solid;">Not only that=
, but some might as well preferer using the comma for all argument passing.=
</blockquote></div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0=
px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); bor=
der-left-width: 1px; border-left-style: solid;">Lastly, <span style=3D"disp=
lay: inline !important; float: none; background-color: transparent; color: =
rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-=
serif; font-size: 13px; font-style: normal; font-variant: normal; font-weig=
ht: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decorat=
ion: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-widt=
h: 0px; white-space: normal; word-spacing: 0px;">if we are to ever have nam=
ed arguments=C2=A0</span>this can be used to be extra clear, we are passing=
 a label argument, not naming a regular argument.<br></blockquote><div><fon=
t face=3D"arial,sans-serif"><font face=3D"courier new,monospace"></font><br=
></font></div><div><font face=3D"arial,sans-serif">In any case, the colon i=
s <i>vital</i> for reading code in the correct context</font>, not unlike h=
uman language<font face=3D"arial,sans-serif"><i></i></font><font face=3D"ar=
ial,sans-serif">.</font></div><div><font face=3D"arial,sans-serif"><br></fo=
nt></div><div><font face=3D"arial,sans-serif"><b>Second</b>, and more impor=
tantly, we introduce special rules to deduce unqualified, or partially qual=
ified, label names.</font></div><div><font face=3D"arial,sans-serif"><br></=
font></div><div><font face=3D"arial,sans-serif">The reason for this is befo=
re everything else a semantic one:</font></div><div><font face=3D"arial,san=
s-serif"><br></font></div><div><font face=3D"arial,sans-serif">Normal argum=
ents are user-created object, they live predominately in user code and are =
foreign to the function.</font></div><div><font face=3D"arial,sans-serif">L=
abel arguments, quite the opposite, they are as much as part of the functio=
n as its name (semantically, not technically) - t</font><font face=3D"arial=
,sans-serif">hey,=C2=A0</font></div><div><font face=3D"arial,sans-serif">in=
 the <i>overhelping</i> majority in cases, do <i>not</i> live in user code.=
</font></div><div><font face=3D"arial,sans-serif"><br></font></div><div><bl=
ockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-=
left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; b=
order-left-style: solid;">The only exception is specializing for the stl (l=
ike <font face=3D"courier new,monospace">std::allocator</font>) or speciali=
zing the stl itself (like introducing new <span style=3D"display: inline !i=
mportant; float: none; background-color: transparent; color: rgb(0, 0, 0); =
font-family: DejaVuSans,&quot;DejaVu Sans&quot;,arial,sans-serif; font-size=
: 12.8px; font-style: normal; font-variant: normal; font-weight: 400; lette=
r-spacing: normal; line-height: 14.08px; orphans: 2; text-align: left; text=
-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-str=
oke-width: 0px; white-space: normal; word-spacing: 0px;">execution policies=
</span>).</blockquote></div><div><blockquote class=3D"gmail_quote" style=3D=
"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, =
204, 204); border-left-width: 1px; border-left-style: solid;">We saw that t=
he first case works as expected - one just passes the std-provided label ob=
ject to mark the custom allocator.=C2=A0</blockquote></div><blockquote clas=
s=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; bo=
rder-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-st=
yle: solid;">The second case is a bit more tricky and might force the user =
to do an explicit call to the label argument to prevent the std one being p=
icked by default.</blockquote><blockquote class=3D"gmail_quote" style=3D"ma=
rgin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204=
, 204); border-left-width: 1px; border-left-style: solid;">This can be triv=
ially resolved by providing a user-facing interface in non-std namespace, w=
hich delegates the call to the correctly qualified std function</blockquote=
><div><br></div><div>With that in mind there is no reason to apply standard=
 lookup rules to functions, called with a label argument.=C2=A0</div><div>I=
<i>nstead of looking for the function in the namespaces of the label argume=
nt, we look for the label argument in the enclosing scope of the function.<=
/i></div><div><i></i><br></div><div>This will allow us to have natural labe=
l expressions, without the need of <font face=3D"courier new,monospace">usi=
ng </font>in the enclosing namespaces or the need to qualify the labels.=C2=
=A0<br></div><div><br></div><div><span style=3D"display: inline !important;=
 float: none; background-color: transparent; color: rgb(34, 34, 34); font-f=
amily: courier new,monospace; font-size: 13px; font-style: normal; font-var=
iant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-al=
ign: left; text-decoration: none; text-indent: 0px; text-transform: none; -=
webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">Poi=
nt p1 =3D Point(</span><span style=3D"background-color: transparent; border=
-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-wi=
dth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-imag=
e-slice: 100%; border-image-source: none; border-image-width: 1; border-lef=
t-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; =
border-right-color: rgb(34, 34, 34); border-right-style: none; border-right=
-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bor=
der-top-width: 0px; color: rgb(34, 34, 34); display: inline; float: none; f=
ont-family: courier new,monospace; font-size: 13px; font-style: normal; fon=
t-variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom:=
 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; =
text-align: left; text-decoration: none; text-indent: 0px; text-transform: =
none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0p=
x;">cartesian</span><span style=3D"display: inline !important; float: none;=
 background-color: transparent; color: rgb(34, 34, 34); font-family: courie=
r new,monospace; font-size: 13px; font-style: normal; font-variant: normal;=
 font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; te=
xt-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-s=
troke-width: 0px; white-space: normal; word-spacing: 0px;">: 5.7, 1.2); //&=
lt; label_scope::<span style=3D"background-color: transparent; border-botto=
m-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0=
px; border-image-outset: 0; border-image-repeat: stretch; border-image-slic=
e: 100%; border-image-source: none; border-image-width: 1; border-left-colo=
r: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border=
-right-color: rgb(34, 34, 34); border-right-style: none; border-right-width=
: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-to=
p-width: 0px; color: rgb(34, 34, 34); display: inline; float: none; font-fa=
mily: courier new,monospace; font-size: 13px; font-style: normal; font-vari=
ant: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; =
margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-b=
ottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-a=
lign: left; text-decoration: none; text-indent: 0px; text-transform: none; =
-webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"></=
span><span style=3D"background-color: transparent; border-bottom-color: rgb=
(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-i=
mage-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bor=
der-image-source: none; border-image-width: 1; border-left-color: rgb(34, 3=
4, 34); border-left-style: none; border-left-width: 0px; border-right-color=
: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; borde=
r-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px=
; color: rgb(34, 34, 34); display: inline; float: none; font-family: courie=
r new,monospace; font-size: 13px; font-style: normal; font-variant: normal;=
 font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left:=
 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; =
padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; =
text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text=
-stroke-width: 0px; white-space: normal; word-spacing: 0px;">cartesian look=
ed in the enclosing scope of Point::Point(<span style=3D"display: inline !i=
mportant; float: none; background-color: transparent; color: rgb(34, 34, 34=
); font-family: courier new,monospace; font-size: 13px; font-style: normal;=
 font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2=
; text-align: left; text-decoration: none; text-indent: 0px; text-transform=
: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: =
0px;">. . .</span>), which is the Point class</span></span></div><div><br><=
/div><div>A hypothetical</div><div><font face=3D"courier new,monospace"></f=
ont><br></div><div><font face=3D"courier new,monospace">namespace std {</fo=
nt><br></div><div><font face=3D"courier new,monospace">case struct in_place=
;</font></div><div><font face=3D"courier new,monospace">=E2=80=A6</font></d=
iv><div><font face=3D"courier new,monospace">template&lt;class... Args &gt;=
 <br>optional(case in_place, Args&amp;&amp;... args );</font></div><div><fo=
nt face=3D"courier new,monospace">}</font></div><div><font face=3D"courier =
new,monospace"><br></font></div><div><font face=3D"courier new,monospace">/=
/ user</font></div><div><font face=3D"courier new,monospace"></font><br></d=
iv><div><span style=3D"display: inline !important; float: none; background-=
color: transparent; color: rgb(34, 34, 34); font-family: courier new,monosp=
ace; font-size: 13px; font-style: normal; font-variant: normal; font-weight=
: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoratio=
n: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width:=
 0px; white-space: normal; word-spacing: 0px;">case struct in_place;</span>=
</div><div><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><fon=
t face=3D"courier new,monospace"></font><br></div><div><font face=3D"courie=
r new,monospace">void func()=C2=A0</font></div><div><font face=3D"courier n=
ew,monospace">{</font></div><div><font face=3D"courier new,monospace">=C2=
=A0 std::optional&lt;string&gt;(in_place: 3, &#39;A&#39;); <i>//&lt; in_pla=
ce in std used=C2=A0</i></font></div><div><font face=3D"courier new,monospa=
ce"><i>//=C2=A0</i><span style=3D"display: inline !important; float: none; =
background-color: transparent; color: rgb(34, 34, 34); font-family: courier=
 new,monospace; font-size: 13px; font-style: normal; font-variant: normal; =
font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; tex=
t-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-st=
roke-width: 0px; white-space: normal; word-spacing: 0px;">std::optional&lt;=
string&gt;(::in_place: 3, &#39;A&#39;); </span><i style=3D"background-attac=
hment: scroll; background-clip: border-box; background-color: transparent; =
background-image: none; background-origin: padding-box; background-position=
-x: 0%; background-position-y: 0%; background-repeat: repeat; background-si=
ze: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; =
border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stre=
tch; border-image-slice: 100%; border-image-source: none; border-image-widt=
h: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: no=
ne; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-=
style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: co=
urier new,monospace; font-size: 13px; font-style: italic; font-variant: nor=
mal; font-weight: 400; height: auto; letter-spacing: normal; margin-bottom:=
 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px;=
 orphans: 2; overflow: visible; overflow-x: visible; overflow-y: visible; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
; text-align: left; text-decoration: none; text-indent: 0px; text-transform=
: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: =
0px;">//&lt; ::in_place used</i></font><font face=3D"courier new,monospace"=
></font></div><div><font face=3D"courier new,monospace">}</font></div><div>=
<font face=3D"courier new,monospace"><i><br></i></font></div>Another exampl=
e<div><i><font face=3D"courier new,monospace"><br></font></i></div><div><fo=
nt face=3D"courier new,monospace"><div style=3D"background-color: transpare=
nt; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border=
-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; b=
order-image-slice: 100%; border-image-source: none; border-image-width: 1; =
border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bo=
rder-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style:=
 none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quo=
t;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px=
; font-style: normal; font-variant: normal; font-weight: 400; letter-spacin=
g: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-=
top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right=
: 0px; padding-top: 0px; text-align: left; text-decoration: none; text-inde=
nt: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space:=
 normal; word-spacing: 0px;"><font face=3D"courier new,monospace" style=3D"=
border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bot=
tom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; borde=
r-image-slice: 100%; border-image-source: none; border-image-width: 1; bord=
er-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width:=
 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; border=
-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: non=
e; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-righ=
t: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-ri=
ght: 0px; padding-top: 0px;">struct circle</font></div><div style=3D"backgr=
ound-color: transparent; border-bottom-color: rgb(34, 34, 34); border-botto=
m-style: none; border-bottom-width: 0px; border-image-outset: 0; border-ima=
ge-repeat: stretch; border-image-slice: 100%; border-image-source: none; bo=
rder-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style:=
 none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-=
right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 3=
4); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); =
font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-s=
erif; font-size: 13px; font-style: normal; font-variant: normal; font-weigh=
t: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margi=
n-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decora=
tion: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-wid=
th: 0px; white-space: normal; word-spacing: 0px;"><font face=3D"courier new=
,monospace" style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-st=
yle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-r=
epeat: stretch; border-image-slice: 100%; border-image-source: none; border=
-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: non=
e; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-righ=
t-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); =
border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-l=
eft: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-=
left: 0px; padding-right: 0px; padding-top: 0px;">{</font></div><div style=
=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34); bo=
rder-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; =
border-image-repeat: stretch; border-image-slice: 100%; border-image-source=
: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-l=
eft-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34,=
 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;qu=
ot;,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; =
font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: =
0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; p=
adding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; t=
ext-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-=
stroke-width: 0px; white-space: normal; word-spacing: 0px;"><font face=3D"c=
ourier new,monospace" style=3D"border-bottom-color: rgb(34, 34, 34); border=
-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bord=
er-image-repeat: stretch; border-image-slice: 100%; border-image-source: no=
ne; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); b=
order-right-style: none; border-right-width: 0px; border-top-color: rgb(34,=
 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px=
; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=C2=A0 case str=
uct=C2=A0<span style=3D"background-color: transparent; border-bottom-color:=
 rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bord=
er-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%;=
 border-image-source: none; border-image-width: 1; border-left-color: rgb(3=
4, 34, 34); border-left-style: none; border-left-width: 0px; border-right-c=
olor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; b=
order-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width:=
 0px; color: rgb(34, 34, 34); display: inline; float: none; font-family: co=
urier new,monospace; font-size: 13px; font-style: normal; font-variant: nor=
mal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-l=
eft: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: le=
ft; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-=
text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">bottomLeft=
;</span></font></div><div style=3D"background-color: transparent; border-bo=
ttom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width=
: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-s=
lice: 100%; border-image-source: none; border-image-width: 1; border-left-c=
olor: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bor=
der-right-color: rgb(34, 34, 34); border-right-style: none; border-right-wi=
dth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border=
-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;q=
uot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style:=
 normal; font-variant: normal; font-weight: 400; letter-spacing: normal; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orp=
hans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; text=
-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word=
-spacing: 0px;">=C2=A0 ...</div><div style=3D"background-color: transparent=
; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-b=
ottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bor=
der-image-slice: 100%; border-image-source: none; border-image-width: 1; bo=
rder-left-color: rgb(34, 34, 34); border-left-style: none; border-left-widt=
h: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bord=
er-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: n=
one; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;=
Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; =
font-style: normal; font-variant: normal; font-weight: 400; letter-spacing:=
 normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-to=
p: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: =
0px; padding-top: 0px; text-align: left; text-decoration: none; text-indent=
: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: n=
ormal; word-spacing: 0px;"><font style=3D"border-bottom-color: rgb(34, 34, =
34); border-bottom-style: none; border-bottom-width: 0px; border-image-outs=
et: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image=
-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); b=
order-left-style: none; border-left-width: 0px; border-right-color: rgb(34,=
 34, 34); border-right-style: none; border-right-width: 0px; border-top-col=
or: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-=
bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-=
bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><spa=
n style=3D"background-color: transparent; border-bottom-color: rgb(34, 34, =
34); border-bottom-style: none; border-bottom-width: 0px; border-image-outs=
et: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image=
-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); b=
order-left-style: none; border-left-width: 0px; border-right-color: rgb(34,=
 34, 34); border-right-style: none; border-right-width: 0px; border-top-col=
or: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: =
rgb(34, 34, 34); display: inline; float: none; font-size: 13px; font-style:=
 normal; font-variant: normal; font-weight: 400; letter-spacing: normal; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orp=
hans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; text=
-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word=
-spacing: 0px;"><font face=3D"courier new,monospace" style=3D"border-bottom=
-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0p=
x; border-image-outset: 0; border-image-repeat: stretch; border-image-slice=
: 100%; border-image-source: none; border-image-width: 1; border-left-color=
: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-=
right-color: rgb(34, 34, 34); border-right-style: none; border-right-width:=
 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top=
-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margi=
n-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; pad=
ding-top: 0px;">=C2=A0 <span style=3D"background-color: transparent; border=
-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-wi=
dth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-imag=
e-slice: 100%; border-image-source: none; border-image-width: 1; border-lef=
t-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; =
border-right-color: rgb(34, 34, 34); border-right-style: none; border-right=
-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bor=
der-top-width: 0px; color: rgb(34, 34, 34); display: inline; float: none; f=
ont-size: 13px; font-style: normal; font-variant: normal; font-weight: 400;=
 letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right=
: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px;=
 padding-right: 0px; padding-top: 0px; text-align: left; text-decoration: n=
one; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px=
; white-space: normal; word-spacing: 0px;">circle</span>(case <span style=
=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34); bo=
rder-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; =
border-image-repeat: stretch; border-image-slice: 100%; border-image-source=
: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-l=
eft-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34,=
 34, 34); display: inline; float: none; font-size: 13px; font-style: normal=
; font-variant: normal; font-weight: 400; letter-spacing: normal; margin-bo=
ttom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2=
; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: =
0px; text-align: left; text-decoration: none; text-indent: 0px; text-transf=
orm: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacin=
g: 0px;">bottomLeft</span>, point p, size sz);</font></span><b style=3D"bac=
kground-attachment: scroll; background-clip: border-box; background-color: =
transparent; background-image: none; background-origin: padding-box; backgr=
ound-position-x: 0%; background-position-y: 0%; background-repeat: repeat; =
background-size: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-=
style: none; border-bottom-width: 0px; border-image-outset: 0; border-image=
-repeat: stretch; border-image-slice: 100%; border-image-source: none; bord=
er-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: n=
one; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-ri=
ght-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34)=
; border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); fo=
nt-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; margin-r=
ight: 0px; margin-top: 0px; min-width: 0px; overflow: visible; overflow-x: =
visible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px;"></b><i style=3D"background-attachment: sc=
roll; background-clip: border-box; background-color: transparent; backgroun=
d-image: none; background-origin: padding-box; background-position-x: 0%; b=
ackground-position-y: 0%; background-repeat: repeat; background-size: auto;=
 border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bo=
ttom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bord=
er-image-slice: 100%; border-image-source: none; border-image-width: 1; bor=
der-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width=
: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; borde=
r-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: no=
ne; border-top-width: 0px; color: rgb(34, 34, 34); font-size: 13px; height:=
 auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top:=
 0px; min-width: 0px; overflow: visible; overflow-x: visible; overflow-y: v=
isible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px;"></i><u style=3D"background-attachment: scroll; background-clip:=
 border-box; background-color: transparent; background-image: none; backgro=
und-origin: padding-box; background-position-x: 0%; background-position-y: =
0%; background-repeat: repeat; background-size: auto; border-bottom-color: =
rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; borde=
r-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; =
border-image-source: none; border-image-width: 1; border-left-color: rgb(34=
, 34, 34); border-left-style: none; border-left-width: 0px; border-right-co=
lor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bo=
rder-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: =
0px; color: rgb(34, 34, 34); font-size: 13px; height: auto; margin-bottom: =
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; =
overflow: visible; overflow-x: visible; overflow-y: visible; padding-bottom=
: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></u><sub s=
tyle=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bo=
rder-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretc=
h; border-image-slice: 100%; border-image-source: none; border-image-width:=
 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-lef=
t-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none=
; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-st=
yle: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; mar=
gin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pa=
dding-right: 0px; padding-top: 0px;"></sub><sup style=3D"border-bottom-colo=
r: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bo=
rder-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100=
%; border-image-source: none; border-image-width: 1; border-left-color: rgb=
(34, 34, 34); border-left-style: none; border-left-width: 0px; border-right=
-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px;=
 border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-widt=
h: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top=
: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-=
top: 0px;"></sup><strike style=3D"border-bottom-color: rgb(34, 34, 34); bor=
der-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; b=
order-image-repeat: stretch; border-image-slice: 100%; border-image-source:=
 none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-le=
ft-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34)=
; border-right-style: none; border-right-width: 0px; border-top-color: rgb(=
34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom: =
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: =
0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></strike><br=
 style=3D"background-attachment: scroll; background-clip: border-box; backg=
round-color: transparent; background-image: none; background-origin: paddin=
g-box; background-position-x: 0%; background-position-y: 0%; background-rep=
eat: repeat; background-size: auto; border-bottom-color: rgb(34, 34, 34); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
 border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-=
left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 3=
4); border-right-style: none; border-right-width: 0px; border-top-color: rg=
b(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34=
, 34, 34); font-size: 13px; height: auto; margin-bottom: 0px; margin-left: =
0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible;=
 overflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px;"></font></div><div style=3D"b=
ackground-color: transparent; border-bottom-color: rgb(34, 34, 34); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(34, =
34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, =
34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,s=
ans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-=
weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; =
margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; paddin=
g-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-d=
ecoration: none; text-indent: 0px; text-transform: none; -webkit-text-strok=
e-width: 0px; white-space: normal; word-spacing: 0px;"><font face=3D"courie=
r new,monospace" style=3D"border-bottom-color: rgb(34, 34, 34); border-bott=
om-style: none; border-bottom-width: 0px; border-image-outset: 0; border-im=
age-repeat: stretch; border-image-slice: 100%; border-image-source: none; b=
order-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style=
: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border=
-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, =
34); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; mar=
gin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pad=
ding-left: 0px; padding-right: 0px; padding-top: 0px;">};</font></div><div =
style=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34=
); border-bottom-style: none; border-bottom-width: 0px; border-image-outset=
: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-s=
ource: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bor=
der-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 3=
4, 34); border-right-style: none; border-right-width: 0px; border-top-color=
: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rg=
b(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&a=
mp;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: nor=
mal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-l=
eft: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: le=
ft; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-=
text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><font face=
=3D"courier new,monospace" style=3D"border-bottom-color: rgb(34, 34, 34); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
 border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-=
left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 3=
4); border-right-style: none; border-right-width: 0px; border-top-color: rg=
b(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom=
: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom=
: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><br></font=
></div><div style=3D"background-color: transparent; border-bottom-color: rg=
b(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-=
image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bo=
rder-image-source: none; border-image-width: 1; border-left-color: rgb(34, =
34, 34); border-left-style: none; border-left-width: 0px; border-right-colo=
r: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bord=
er-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0p=
x; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot=
;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-=
variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0=
px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; paddi=
ng-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; te=
xt-align: left; text-decoration: none; text-indent: 0px; text-transform: no=
ne; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;=
"><font face=3D"courier new,monospace" style=3D"border-bottom-color: rgb(34=
, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-imag=
e-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border=
-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34, =
34); border-left-style: none; border-left-width: 0px; border-right-color: r=
gb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-t=
op-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; m=
argin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; pa=
dding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;=
">using std::optional;</font></div><div style=3D"margin: 0px; padding: 0px;=
 border: 0px rgb(34, 34, 34); border-image: none; text-align: left; color: =
rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: no=
rmal; font-size: 13px; font-variant: normal; word-spacing: 0px; white-space=
: normal; orphans: 2; -webkit-text-stroke-width: 0px; background-color: tra=
nsparent;"><font face=3D"courier new,monospace" style=3D"border-bottom-colo=
r: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bo=
rder-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100=
%; border-image-source: none; border-image-width: 1; border-left-color: rgb=
(34, 34, 34); border-left-style: none; border-left-width: 0px; border-right=
-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px;=
 border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-widt=
h: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top=
: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-=
top: 0px;"><span style=3D"display: inline !important; float: none; backgrou=
nd-color: transparent; color: rgb(34, 34, 34); font-family: courier new,mon=
ospace; font-size: 13px; font-style: normal; font-variant: normal; font-wei=
ght: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decora=
tion: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-wid=
th: 0px; white-space: normal; word-spacing: 0px;">optional&lt;<span style=
=3D"display: inline !important; float: none; background-color: transparent;=
 color: rgb(34, 34, 34); font-family: courier new,monospace; font-size: 13p=
x; font-style: normal; font-variant: normal; font-weight: 400; letter-spaci=
ng: normal; orphans: 2; text-align: left; text-decoration: none; text-inden=
t: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: =
normal; word-spacing: 0px;">circle</span>&gt;(in_place: <span style=3D"back=
ground-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bot=
tom-style: none; border-bottom-width: 0px; border-image-outset: 0; border-i=
mage-repeat: stretch; border-image-slice: 100%; border-image-source: none; =
border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-styl=
e: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); borde=
r-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34,=
 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34)=
; display: inline; float: none; font-family: courier new,monospace; font-si=
ze: 13px; font-style: normal; font-variant: normal; font-weight: 400; lette=
r-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
 margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; t=
ext-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; whit=
e-space: normal; word-spacing: 0px;">bottomLeft:</span> p, sz); //&lt;=C2=
=A0<span style=3D"display: inline !important; float: none; background-color=
: transparent; color: rgb(34, 34, 34); font-family: courier new,monospace; =
font-size: 13px; font-style: italic; font-variant: normal; font-weight: 400=
; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: no=
ne; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px;=
 white-space: normal; word-spacing: 0px;">in_place still in std, bottomLeft=
 in circle</span></span><b></b><i></i><u></u><sub></sub><sup></sup><strike>=
</strike><br></font></div></font></div><div><i><font face=3D"courier new,mo=
nospace"><b></b><u></u><sub></sub><sup></sup><strike></strike><b></b><u></u=
><sub></sub><sup></sup><strike></strike><br></font></i></div><div>Lookup li=
ke this might be easer said then done, there is no denying however, it is t=
he more correct one in general - where the label is located depends on the =
function, not the other way around.</div><div><br></div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; bor=
der-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-sty=
le: solid;">It is hard to tell if such a lookup will make finding the funct=
ion itself harder or easer - after all, the fact that the compiler knows th=
e argument is label one, dramatically can limit the overlanding set, =C2=A0=
</blockquote><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px=
 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-le=
ft-width: 1px; border-left-style: solid;">no matter in which namespace is <=
i>either</i> the function <i>or</i> the label argument. In a way, all label=
s are as if a subclass of just one parent class, culling based on that <i>s=
hould</i> help lookup. =C2=A0</blockquote><div><b></b><br></div><div><br></=
div><div><b>Part 3: Status Quo</b></div><div><b><br></b></div><div>Sadly, w=
e can&#39;t make current standard types, used as tags, &quot;just work&quot=
; as label arguments, not without introducing completely new, parallel rule=
s.=C2=A0</div><div>Even if we do, the results will be partial - the dissona=
nce b/w declaration and invocation will still be present.=C2=A0</div><div>W=
e also can&#39;t silently change the lookup rules without breaking user cod=
e, the best we can do is allow colon as separator of &quot;tag classes&quot=
; (empty classes with explicit ctor),</div><div>but this, is as I said, com=
pletely parallel rule with questionable benefits.</div><div><br></div><bloc=
kquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-le=
ft: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; bor=
der-left-style: solid;">It should be noted, migrating the stl to labels is =
trivial - it literally means two lines of code for every function using a t=
ag. One to introduce a case struct, reusing the old name, and one to create=
 a forwarding overload.</blockquote><blockquote class=3D"gmail_quote" style=
=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(20=
4, 204, 204); border-left-width: 1px; border-left-style: solid;">Doing this=
 will give us all the benefits of using labels - association b/w declaratio=
n and invocation, better lookup rules and more expressive syntax.</blockquo=
te><div><br></div><div><br></div><div>Beyond that we could rethink the nami=
ng variations of some standard functions. The name of the function is to de=
scribe what the function <i>does</i>,=C2=A0</div><div>if we are forced to n=
ame the function based on what the arguments are (to make it more clear), o=
r invent names to avoid redeclaration, then we have limitation of the funct=
ion declaration syntax.</div><div>This proposal is <i>not</i> well suited f=
or the first case, but is quite well suited for the latter.</div><div><br><=
/div><div>For example, <font face=3D"courier new,monospace">std::find</font=
> is descriptive to anyone, including a non-programmer, however <font face=
=3D"courier new,monospace">find_if</font> - not so much, if at all.</div><d=
iv><br></div><div>By naming the entire function this way it is implied <i>t=
he function itself </i>have some sort of prerequisite of to when and if the=
 finding process takes place - <i>&quot;perform finding (only) if something=
, otherwise - bail out&quot;</i>.</div><div>However by simply shifting the =
&quot;if&quot; part to the comparison function we radically improve the com=
munication with the user.</div><div><br></div><div><font face=3D"courier ne=
w,monospace">std::find(begin, end, if: [value](auto val){. . .});</font><b>=
</b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></div><div><b>=
</b><i></i><u></u><sub></sub><sup></sup><strike></strike><font face=3D"cour=
ier new,monospace"></font><br></div><div>On one hand we keep the name intac=
t - find still does exactly the same as before, no need for a name change, =
<i>how</i> it does the search has changed however, and we have the opportun=
ity to specify this naturally, as an argument.</div><div>On the other hand,=
 by moving<font face=3D"courier new,monospace"> if</font> right next to the=
 predicate it is immediately clear - <i>&quot;if this returns true, we foun=
d our match&quot;</i>.=C2=A0</div><div><br></div><div>It is arguably the si=
ngle most clear interface possible, and it is all about human language.</di=
v><div><br></div><div><br style=3D"background-attachment: scroll; backgroun=
d-clip: border-box; background-color: transparent; background-image: none; =
background-origin: padding-box; background-position-x: 0%; background-posit=
ion-y: 0%; background-repeat: repeat; background-size: auto; border-bottom-=
color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px=
; border-image-outset: 0; border-image-repeat: stretch; border-image-slice:=
 100%; border-image-source: none; border-image-width: 1; border-left-color:=
 rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(34, 34, 34); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-=
width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,=
&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; height: auto; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min=
-width: 0px; overflow: visible; overflow-x: visible; overflow-y: visible; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
;"></div><div><div style=3D"background-color: transparent; border-bottom-co=
lor: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; =
border-image-outset: 0; border-image-repeat: stretch; border-image-slice: 1=
00%; border-image-source: none; border-image-width: 1; border-left-color: r=
gb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-rig=
ht-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0p=
x; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-wi=
dth: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&a=
mp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal=
; font-variant: normal; font-weight: 400; letter-spacing: normal; margin-bo=
ttom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2=
; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: =
0px; text-align: left; text-decoration: none; text-indent: 0px; text-transf=
orm: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacin=
g: 0px;"><b style=3D"background-attachment: scroll; background-clip: border=
-box; background-color: transparent; background-image: none; background-ori=
gin: padding-box; background-position-x: 0%; background-position-y: 0%; bac=
kground-repeat: repeat; background-size: auto; border-bottom-color: rgb(34,=
 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image=
-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-=
image-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 3=
4); border-left-style: none; border-left-width: 0px; border-right-color: rg=
b(34, 34, 34); border-right-style: none; border-right-width: 0px; border-to=
p-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; co=
lor: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helv=
etica&amp;quot;,sans-serif; font-size: 13px; height: auto; margin-bottom: 0=
px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; o=
verflow: visible; overflow-x: visible; overflow-y: visible; padding-bottom:=
 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Part 4: Con=
clusion</b></div><b></b><i></i><u></u><sub></sub><sup></sup><strike></strik=
e><br></div><div>Presented here was a method for introducing human (and tem=
plates) friendly functions, that are easier to define then static functions=
, when used as &quot;named constructor&quot;,=C2=A0</div><div>and at the sa=
me time are more expressive, even for normal functions, as the &quot;naming=
&quot; can be done in-between arguments.</div><div>The method is also as po=
werful as the current tag idiom, used in generic code, yet much easier (and=
 more clear) in both declaration and usage.</div><div><br></div><div>By hav=
ing these qualities this feature has the potential to combine the two idiom=
s into one core feature, usable across the entire spectrum of C++ programme=
rs expertise.</div><div><br></div><div><br></div><div>Thank You for Your ti=
me!</div><div><br></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/7ad94c40-9a52-4bb3-9aaa-cc885407e9bd%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/7ad94c40-9a52-4bb3-9aaa-cc885407e9bd=
%40isocpp.org</a>.<br />

------=_Part_11054_1030164733.1531743924237--

------=_Part_11053_1672965350.1531743924231--

.


Author: Zhihao Yuan <zy@miator.net>
Date: Mon, 16 Jul 2018 10:43:38 -0400
Raw View
This is a multi-part message in MIME format.

--b1_0d2aa92d0a86eb80901694da47e16f69
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

This call site syntax looks like saying the first argument
has value 5.7

Besides, regardless of what can be done for generic
code, =E2=80=9Cnamed constructors=E2=80=9D should at least support
the Point::cartesian(5.7, 1.2) syntax.

--
Zhihao Yuan, ID lichray
The best way to predict the future is to invent it.
_______________________________________________

From: mihailnajdenov@gmail.com <mihailnajdenov@gmail.com>
Sent: Monday, July 16, 2018 7:25 AM

  Point p1 =3D Point(cartesian: 5.7, 1.2);

  Point p2 =3D Point(polar: 5.7, 1.2);

--=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.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/46Dztl6Ohf0P6Gm9AoLfynK6m0hbODxyJyrr5jTRg4MnPrUJ=
w4leuN5p1OSrpno4VioiKtfgj5YynEaEtye3wn14sZC4Mu_l92mTF_XIOM0%3D%40miator.net=
..

--b1_0d2aa92d0a86eb80901694da47e16f69
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<html><head></head><body><div class=3D"WordSection1"><p class=3D"MsoNormal"=
>This call site syntax looks like saying the first argument<br/>has value 5=
..7<br/><br/>Besides, regardless of what can be done for generic<br/>code, =
=E2=80=9Cnamed constructors=E2=80=9D should at least support<br/>the Point:=
:cartesian(5.7, 1.2) syntax.<br/><br/><o:p></o:p></p><p class=3D"MsoNormal"=
>--<br/>Zhihao Yuan, ID lichray<br/>The best way to predict the future is t=
o invent it.<br/>_______________________________________________<o:p></o:p>=
</p><p class=3D"MsoNormal"><o:p>=C2=A0</o:p></p><div style=3D"border:none;b=
order-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt"><div><div style=3D"b=
order:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in"><p cla=
ss=3D"MsoNormal"><b>From:</b> mihailnajdenov@gmail.com &lt;mihailnajdenov@g=
mail.com&gt; <br/><b>Sent:</b> Monday, July 16, 2018 7:25 AM<br/><br/><o:p>=
</o:p></p></div></div><div><div><p class=3D"MsoNormal"><span style=3D"font-=
family:&#34;Courier New&#34;">=C2=A0=C2=A0Point p1 =3D Point(</span><span s=
tyle=3D"font-size:10.0pt;font-family:&#34;Courier New&#34;;color:#222222;bo=
rder:none windowtext 1.0pt;padding:0in">cartesian</span><span style=3D"font=
-family:&#34;Courier New&#34;">: 5.7, 1.2);=C2=A0<o:p></o:p></span></p><p c=
lass=3D"MsoNormal"><span style=3D"font-family:&#34;Courier New&#34;">=C2=A0=
 Point p2 =3D Point(polar: 5.7, 1.2);=C2=A0<o:p></o:p></span></p></div></di=
v></div></div></body></html>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/46Dztl6Ohf0P6Gm9AoLfynK6m0hbODxyJyrr5=
jTRg4MnPrUJw4leuN5p1OSrpno4VioiKtfgj5YynEaEtye3wn14sZC4Mu_l92mTF_XIOM0%3D%4=
0miator.net?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/46Dztl6Ohf0P6Gm9AoLfynK6m0hbODxyJyrr5=
jTRg4MnPrUJw4leuN5p1OSrpno4VioiKtfgj5YynEaEtye3wn14sZC4Mu_l92mTF_XIOM0%3D%4=
0miator.net</a>.<br />

--b1_0d2aa92d0a86eb80901694da47e16f69--


.


Author: mihailnajdenov@gmail.com
Date: Mon, 16 Jul 2018 11:54:21 -0700 (PDT)
Raw View
------=_Part_30577_1312979978.1531767261608
Content-Type: multipart/alternative;
 boundary="----=_Part_30578_1155369674.1531767261609"

------=_Part_30578_1155369674.1531767261609
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable



On Monday, July 16, 2018 at 5:43:48 PM UTC+3, Zhihao Yuan wrote:
>
> This call site syntax looks like saying the first argument
> has value 5.7
>
=20
Few ways around this.=20

First and foremost, people will get used to the multiple use of label=20
arguments -=20
in one case they label the function itself, like in parallel stl cases,=20
in other they label an argument, like the rect(bottomLeft: point, size)case=
=20
and often they label multiple arguments like the case here and all=20
"in-place"-like constructors in std.

The designer is also free to accept std::pair instead, forcing a more=20
explicit call - Point(cartesian: {5.7, 1.2});
or, in more complex cases, he can add another label to break parameter=20
"packs".

Lastly, one is free to use a comma after the label - Point(cartesian:, 5.7,=
=20
1.2); so to be more specific.
=20

And don't forget Point::cartesian() is not any better! Not by a long shot.
If this is to be done right it should be following a convention like the=20
Qt's "from" one  - fromCartesian(. . .)- just a floating static function=20
with the name 'cartesian' means little without documentation.=20
At least as label the user can deduce, it is not about the first variable=
=20
as "a cartesian float" does not mean anything, neither does "polar float".=
=20

Also, in reality "cartesian" should be implicit. The user will ever have to=
=20
specify only "polar: . . .", as it is unusual.
=20

>
> Besides, regardless of what can be done for generic
> code, =E2=80=9Cnamed constructors=E2=80=9D should at least support
> the Point::cartesian(5.7, 1.2) syntax.
>


Static functions used as named constructors don't work with template=20
argument deduction (along with many other downsides) and we should move=20
away from them *completely*.=20
The fact we teach and use this idiom for 30 years does not make it a good=
=20
one - a static function *in no way* implies construction.

Static functions have no benefits besides written text to the user,=20
something label arguments are capable of doing, not only that, but the text=
=20
can move around the arguments.

Yes the user will need to learn to read labels, but chances are, one will=
=20
be to deduce the meaning from context, much like one can, most of the time,=
=20
deduce which static functions are "constructors".

=20

>
> --
> Zhihao Yuan, ID lichray
> The best way to predict the future is to invent it.
> _______________________________________________
>
> =20
>
> *From:* mihailn...@gmail.com <javascript:> <mihailn...@gmail.com=20
> <javascript:>>=20
> *Sent:* Monday, July 16, 2018 7:25 AM
>
>   Point p1 =3D Point(cartesian: 5.7, 1.2);=20
>
>   Point p2 =3D Point(polar: 5.7, 1.2);=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.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/cfef3371-ce08-4e72-97ad-4328333be859%40isocpp.or=
g.

------=_Part_30578_1155369674.1531767261609
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><font face=3D"arial,sans-serif"></font><br><br>On Monday, =
July 16, 2018 at 5:43:48 PM UTC+3, Zhihao Yuan wrote:<blockquote class=3D"g=
mail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc sol=
id;padding-left: 1ex;"><div><div><p class=3D"MsoNormal">This call site synt=
ax looks like saying the first argument<br>has value 5.7<br></p></div></div=
></blockquote><div>=C2=A0</div><div>Few ways around this.=C2=A0</div><div><=
br></div><div>First and foremost, people will get used to the multiple use =
of label arguments -=C2=A0</div><div>in one case they label the function it=
self, like in parallel stl cases,=C2=A0</div><div>in other they label an ar=
gument, like the <font face=3D"courier new,monospace">rect(bottomLeft: poin=
t, size)</font>case=C2=A0</div><div>and often they label multiple arguments=
 like the case here and all &quot;in-place&quot;-like constructors in std.<=
/div><div><br style=3D"background-attachment: scroll; background-clip: bord=
er-box; background-color: transparent; background-image: none; background-o=
rigin: padding-box; background-position-x: 0%; background-position-y: 0%; b=
ackground-repeat: repeat; background-size: auto; border-bottom-color: rgb(3=
4, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34,=
 34); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; =
color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;He=
lvetica&amp;quot;,sans-serif; font-size: 13px; height: auto; margin-bottom:=
 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px;=
 overflow: visible; overflow-x: visible; overflow-y: visible; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></div><di=
v><div style=3D"background-color: transparent; border-bottom-color: rgb(34,=
 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image=
-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-=
image-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 3=
4); border-left-style: none; border-left-width: 0px; border-right-color: rg=
b(34, 34, 34); border-right-style: none; border-right-width: 0px; border-to=
p-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; co=
lor: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helv=
etica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-varia=
nt: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; m=
argin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bo=
ttom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-al=
ign: left; text-decoration: none; text-indent: 0px; text-transform: none; -=
webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">The=
 designer is also free to accept <font face=3D"courier new,monospace" style=
=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border=
-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; b=
order-image-slice: 100%; border-image-source: none; border-image-width: 1; =
border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bo=
rder-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style:=
 none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddin=
g-right: 0px; padding-top: 0px;">std::pair</font> instead, forcing a more e=
xplicit call - <font face=3D"courier new,monospace" style=3D"border-bottom-=
color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px=
; border-image-outset: 0; border-image-repeat: stretch; border-image-slice:=
 100%; border-image-source: none; border-image-width: 1; border-left-color:=
 rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(34, 34, 34); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-=
width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;">Point(cartesian: {5.7, 1.2});</font></div><div style=3D"back=
ground-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bot=
tom-style: none; border-bottom-width: 0px; border-image-outset: 0; border-i=
mage-repeat: stretch; border-image-slice: 100%; border-image-source: none; =
border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-styl=
e: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); borde=
r-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34,=
 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34)=
; font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans=
-serif; font-size: 13px; font-style: normal; font-variant: normal; font-wei=
ght: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; mar=
gin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-l=
eft: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-deco=
ration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-w=
idth: 0px; white-space: normal; word-spacing: 0px;"><font face=3D"arial,san=
s-serif" style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style=
: none; border-bottom-width: 0px; border-image-outset: 0; border-image-repe=
at: stretch; border-image-slice: 100%; border-image-source: none; border-im=
age-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; =
border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-s=
tyle: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bor=
der-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left=
: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px;">or, in more complex cases, h=
e can add another label to break parameter &quot;packs&quot;.</font></div><=
div style=3D"background-color: transparent; border-bottom-color: rgb(34, 34=
, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-ou=
tset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-ima=
ge-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34);=
 border-left-style: none; border-left-width: 0px; border-right-color: rgb(3=
4, 34, 34); border-right-style: none; border-right-width: 0px; border-top-c=
olor: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color=
: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helveti=
ca&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant:=
 normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; marg=
in-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align=
: left; text-decoration: none; text-indent: 0px; text-transform: none; -web=
kit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><font =
face=3D"arial,sans-serif"></font><br></div></div><div>Lastly, one is free t=
o use a comma after the label - <span style=3D"display: inline !important; =
float: none; background-color: transparent; color: rgb(34, 34, 34); font-fa=
mily: courier new,monospace; font-size: 13px; font-style: normal; font-vari=
ant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-ali=
gn: left; text-decoration: none; text-indent: 0px; text-transform: none; -w=
ebkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">Poin=
t(cartesian:, 5.7, 1.2);<font face=3D"arial,sans-serif"> so to be more spec=
ific.</font></span></div><div><font face=3D"courier new,monospace">=C2=A0</=
font><font face=3D"courier new,monospace"><br></font></div><div><b></b><i><=
/i><u></u><sub></sub><sup></sup><strike></strike><br></div><div>And don&#39=
;t forget<font face=3D"courier new,monospace"> Point::<span style=3D"text-a=
lign: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px;=
 letter-spacing: normal; font-size: 13px; font-style: normal; font-variant:=
 normal; font-weight: 400; text-decoration: none; word-spacing: 0px; displa=
y: inline !important; white-space: normal; orphans: 2; float: none; -webkit=
-text-stroke-width: 0px; background-color: transparent;">cartesian() <font =
face=3D"arial,sans-serif">is not any better! Not by a long shot.</font></sp=
an></font></div><div><font face=3D"courier new,monospace"><span style=3D"te=
xt-align: left; color: rgb(34, 34, 34); text-transform: none; text-indent: =
0px; letter-spacing: normal; font-size: 13px; font-style: normal; font-vari=
ant: normal; font-weight: 400; text-decoration: none; word-spacing: 0px; di=
splay: inline !important; white-space: normal; orphans: 2; float: none; -we=
bkit-text-stroke-width: 0px; background-color: transparent;"><font face=3D"=
arial,sans-serif">If this is to be done right it should be following a conv=
ention like the Qt&#39;s &quot;from&quot; one=C2=A0 - </font>fromCartesian(=
.. . .)-<font face=3D"arial,sans-serif"> j</font></span></font><span style=
=3D"text-align: left; color: rgb(34, 34, 34); text-transform: none; text-in=
dent: 0px; letter-spacing: normal; font-size: 13px; font-style: normal; fon=
t-variant: normal; font-weight: 400; text-decoration: none; word-spacing: 0=
px; display: inline !important; white-space: normal; orphans: 2; float: non=
e; -webkit-text-stroke-width: 0px; background-color: transparent;"><font fa=
ce=3D"arial,sans-serif">ust a floating static function with the name &#39;<=
span style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); borde=
r-image: none; text-align: left; color: rgb(34, 34, 34); text-transform: no=
ne; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-style: =
normal; font-variant: normal; font-weight: 400; text-decoration: none; word=
-spacing: 0px; display: inline; white-space: normal; orphans: 2; float: non=
e; -webkit-text-stroke-width: 0px; background-color: transparent;">cartesia=
n&#39; means little without documentation.=C2=A0</span></font></span><span =
style=3D"text-align: left; color: rgb(34, 34, 34); text-transform: none; te=
xt-indent: 0px; letter-spacing: normal; font-size: 13px; font-style: normal=
; font-variant: normal; font-weight: 400; text-decoration: none; word-spaci=
ng: 0px; display: inline !important; white-space: normal; orphans: 2; float=
: none; -webkit-text-stroke-width: 0px; background-color: transparent;"><sp=
an style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-=
image: none; text-align: left; color: rgb(34, 34, 34); text-transform: none=
; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-style: no=
rmal; font-variant: normal; font-weight: 400; text-decoration: none; word-s=
pacing: 0px; display: inline; white-space: normal; orphans: 2; float: none;=
 -webkit-text-stroke-width: 0px; background-color: transparent;"><br></span=
></span></div><div><span style=3D"text-align: left; color: rgb(34, 34, 34);=
 text-transform: none; text-indent: 0px; letter-spacing: normal; font-size:=
 13px; font-style: normal; font-variant: normal; font-weight: 400; text-dec=
oration: none; word-spacing: 0px; display: inline !important; white-space: =
normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; background=
-color: transparent;"><span style=3D"margin: 0px; padding: 0px; border: 0px=
 rgb(34, 34, 34); border-image: none; text-align: left; color: rgb(34, 34, =
34); text-transform: none; text-indent: 0px; letter-spacing: normal; font-s=
ize: 13px; font-style: normal; font-variant: normal; font-weight: 400; text=
-decoration: none; word-spacing: 0px; display: inline; white-space: normal;=
 orphans: 2; float: none; -webkit-text-stroke-width: 0px; background-color:=
 transparent;"><font face=3D"arial,sans-serif">At least as label the user c=
an deduce, it is </font>not <font face=3D"arial,sans-serif">about the first=
 variable as &quot;a cartesian float&quot; does not mean anything, neither =
does &quot;polar float&quot;.=C2=A0</font></span></span></div><div><span st=
yle=3D"text-align: left; color: rgb(34, 34, 34); text-transform: none; text=
-indent: 0px; letter-spacing: normal; font-size: 13px; font-style: normal; =
font-variant: normal; font-weight: 400; text-decoration: none; word-spacing=
: 0px; display: inline !important; white-space: normal; orphans: 2; float: =
none; -webkit-text-stroke-width: 0px; background-color: transparent;"><span=
 style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-im=
age: none; text-align: left; color: rgb(34, 34, 34); text-transform: none; =
text-indent: 0px; letter-spacing: normal; font-size: 13px; font-style: norm=
al; font-variant: normal; font-weight: 400; text-decoration: none; word-spa=
cing: 0px; display: inline; white-space: normal; orphans: 2; float: none; -=
webkit-text-stroke-width: 0px; background-color: transparent;"><font face=
=3D"arial,sans-serif"></font><br></span></span></div><div><span style=3D"te=
xt-align: left; color: rgb(34, 34, 34); text-transform: none; text-indent: =
0px; letter-spacing: normal; font-size: 13px; font-style: normal; font-vari=
ant: normal; font-weight: 400; text-decoration: none; word-spacing: 0px; di=
splay: inline !important; white-space: normal; orphans: 2; float: none; -we=
bkit-text-stroke-width: 0px; background-color: transparent;"><font face=3D"=
arial,sans-serif"><span style=3D"margin: 0px; padding: 0px; border: 0px rgb=
(34, 34, 34); border-image: none; text-align: left; color: rgb(34, 34, 34);=
 text-transform: none; text-indent: 0px; letter-spacing: normal; font-size:=
 13px; font-style: normal; font-variant: normal; font-weight: 400; text-dec=
oration: none; word-spacing: 0px; display: inline; white-space: normal; orp=
hans: 2; float: none; -webkit-text-stroke-width: 0px; background-color: tra=
nsparent;">Also, in reality &quot;<span style=3D"background-color: transpar=
ent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; borde=
r-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; =
border-image-slice: 100%; border-image-source: none; border-image-width: 1;=
 border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-w=
idth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; b=
order-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style=
: none; border-top-width: 0px; color: rgb(34, 34, 34); display: inline; flo=
at: none; font-family: courier new,monospace; font-size: 13px; font-style: =
normal; font-variant: normal; font-weight: 400; letter-spacing: normal; mar=
gin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orph=
ans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; text-=
transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-=
spacing: 0px;"><font face=3D"arial,sans-serif">cartesian&quot;</font> <font=
 face=3D"arial,sans-serif">should be implicit. The user will ever have to s=
pecify only &quot;polar: . . .&quot;, as it is unusual.</font></span></span=
></font></span></div><div><font face=3D"arial,sans-serif"></font>=C2=A0</di=
v><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;b=
order-left: 1px #ccc solid;padding-left: 1ex;"><div><div><p class=3D"MsoNor=
mal"><br>Besides, regardless of what can be done for generic<br>code, =E2=
=80=9Cnamed constructors=E2=80=9D should at least support<br>the Point::car=
tesian(5.7, 1.2) syntax.<br></p></div></div></blockquote><div><br></div><di=
v><br></div><div>Static functions used as named constructors don&#39;t work=
 with template argument deduction (along with many other downsides) and we =
should move away from them <i>completely</i>.=C2=A0</div><div>The fact we t=
each and use this idiom for 30 years does not make it a good one - a static=
 function <i>in no way</i> implies construction.</div><div><br></div><div>S=
tatic functions have no benefits besides written text to the user, somethin=
g label arguments are capable of doing, not only that, but the text can mov=
e around the arguments.</div><div><br></div><div>Yes the user will need to =
learn to read labels, but chances are, one will be to deduce the meaning fr=
om context, much like one can, most of the time, deduce which static functi=
ons are &quot;constructors&quot;.</div><div><br></div><div>=C2=A0</div><blo=
ckquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-=
left: 1px #ccc solid;padding-left: 1ex;"><div><div><p class=3D"MsoNormal"><=
br></p><p class=3D"MsoNormal">--<br>Zhihao Yuan, ID lichray<br>The best way=
 to predict the future is to invent it.<br>______________________________<w=
br>_________________</p><p class=3D"MsoNormal">=C2=A0</p><div style=3D"bord=
er:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt"><div><div s=
tyle=3D"border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0in 0in 0i=
n"><p class=3D"MsoNormal"><b>From:</b> <a onmousedown=3D"this.href=3D&#39;j=
avascript:&#39;;return true;" onclick=3D"this.href=3D&#39;javascript:&#39;;=
return true;" href=3D"javascript:" target=3D"_blank" rel=3D"nofollow" gdf-o=
bfuscated-mailto=3D"36iXXRlECgAJ">mihailn...@gmail.com</a> &lt;<a onmousedo=
wn=3D"this.href=3D&#39;javascript:&#39;;return true;" onclick=3D"this.href=
=3D&#39;javascript:&#39;;return true;" href=3D"javascript:" target=3D"_blan=
k" rel=3D"nofollow" gdf-obfuscated-mailto=3D"36iXXRlECgAJ">mihailn...@gmail=
..com</a>&gt; <br><b>Sent:</b> Monday, July 16, 2018 7:25 AM<br><br></p></di=
v></div><div><div><p class=3D"MsoNormal"><span style=3D"font-family:&quot;C=
ourier New&quot;">=C2=A0=C2=A0Point p1 =3D Point(</span><span style=3D"font=
-size:10.0pt;font-family:&quot;Courier New&quot;;color:#222222;border:none =
windowtext 1.0pt;padding:0in">cartesian</span><span style=3D"font-family:&q=
uot;Courier New&quot;">: 5.7, 1.2);=C2=A0</span></p><p class=3D"MsoNormal">=
<span style=3D"font-family:&quot;Courier New&quot;">=C2=A0 Point p2 =3D Poi=
nt(polar: 5.7, 1.2);=C2=A0</span></p></div></div></div></div></div></blockq=
uote></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/cfef3371-ce08-4e72-97ad-4328333be859%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/cfef3371-ce08-4e72-97ad-4328333be859=
%40isocpp.org</a>.<br />

------=_Part_30578_1155369674.1531767261609--

------=_Part_30577_1312979978.1531767261608--

.


Author: Richard Hodges <hodges.r@gmail.com>
Date: Mon, 16 Jul 2018 21:19:30 +0200
Raw View
--00000000000016cec4057122b661
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Mon, 16 Jul 2018 at 20:54, <mihailnajdenov@gmail.com> wrote:

>
>
> On Monday, July 16, 2018 at 5:43:48 PM UTC+3, Zhihao Yuan wrote:
>>
>> This call site syntax looks like saying the first argument
>> has value 5.7
>>
>
> Few ways around this.
>
> First and foremost, people will get used to the multiple use of label
> arguments -
> in one case they label the function itself, like in parallel stl cases,
> in other they label an argument, like the rect(bottomLeft: point, size)
> case
> and often they label multiple arguments like the case here and all
> "in-place"-like constructors in std.
>
> The designer is also free to accept std::pair instead, forcing a more
> explicit call - Point(cartesian: {5.7, 1.2});
> or, in more complex cases, he can add another label to break parameter
> "packs".
>
> Lastly, one is free to use a comma after the label - Point(cartesian:,
> 5.7, 1.2); so to be more specific.
>
>
> And don't forget Point::cartesian() is not any better! Not by a long shot=
..
> If this is to be done right it should be following a convention like the
> Qt's "from" one  - fromCartesian(. . .)- just a floating static function
> with the name 'cartesian' means little without documentation.
> At least as label the user can deduce, it is not about the first variable
> as "a cartesian float" does not mean anything, neither does "polar float"=
..
>
> Also, in reality "cartesian" should be implicit. The user will ever have
> to specify only "polar: . . .", as it is unusual.
>
>
>>
>> Besides, regardless of what can be done for generic
>> code, =E2=80=9Cnamed constructors=E2=80=9D should at least support
>> the Point::cartesian(5.7, 1.2) syntax.
>>
>
>
> Static functions used as named constructors don't work with template
> argument deduction (along with many other downsides) and we should move
> away from them *completely*.
> The fact we teach and use this idiom for 30 years does not make it a good
> one - a static function *in no way* implies construction.
>

Agree


>
> Static functions have no benefits besides written text to the user,
> something label arguments are capable of doing, not only that, but the te=
xt
> can move around the arguments.
>
> Yes the user will need to learn to read labels, but chances are, one will
> be to deduce the meaning from context, much like one can, most of the tim=
e,
> deduce which static functions are "constructors".
>
>
>
>>
>> --
>> Zhihao Yuan, ID lichray
>> The best way to predict the future is to invent it.
>> _______________________________________________
>>
>>
>>
>> *From:* mihailn...@gmail.com <mihailn...@gmail.com>
>> *Sent:* Monday, July 16, 2018 7:25 AM
>>
>>   Point p1 =3D Point(cartesian: 5.7, 1.2);
>>
>>   Point p2 =3D Point(polar: 5.7, 1.2);
>>
>
There's a problem with this motivating example.

A cartesian co-ordinate cannot be converted to a polar co-ordinate without
providing the conventions implicit in the world geometry.

For example, is the angle clockwise or anti-clockwise and which axis
corresponds to zero degrees of rotation?

You may want to consider:

class Point2d;
class Polar2dCoordinate;
class Geometry2d;

Point2d::Point2d(Polar2dCoordinate const&, Geometry2d const&);
Polar2dCoordinate::Polar2dCoordinate(Point2d const&, Geometry2d const&);

Or similar conversion functions.

This has the advantage of being self-documenting doesn't it?


> --
> 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
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> To view this discussion on the web visit
> https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/cfef3371-ce0=
8-4e72-97ad-4328333be859%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/cfef3371-ce=
08-4e72-97ad-4328333be859%40isocpp.org?utm_medium=3Demail&utm_source=3Dfoot=
er>
> .
>

--=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.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CALvx3hZxSCT74nYccMg0j3f%3Dii3xHPExLQpwubusRveiL=
-_OBg%40mail.gmail.com.

--00000000000016cec4057122b661
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br><div class=3D"gmail_quote"><div dir=3D"ltr">On Mon=
, 16 Jul 2018 at 20:54, &lt;<a href=3D"mailto:mihailnajdenov@gmail.com">mih=
ailnajdenov@gmail.com</a>&gt; wrote:<br></div><blockquote class=3D"gmail_qu=
ote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex=
"><div dir=3D"ltr"><font face=3D"arial,sans-serif"></font><br><br>On Monday=
, July 16, 2018 at 5:43:48 PM UTC+3, Zhihao Yuan wrote:<blockquote class=3D=
"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc soli=
d;padding-left:1ex"><div><div><p class=3D"MsoNormal">This call site syntax =
looks like saying the first argument<br>has value 5.7<br></p></div></div></=
blockquote><div>=C2=A0</div><div>Few ways around this.=C2=A0</div><div><br>=
</div><div>First and foremost, people will get used to the multiple use of =
label arguments -=C2=A0</div><div>in one case they label the function itsel=
f, like in parallel stl cases,=C2=A0</div><div>in other they label an argum=
ent, like the <font face=3D"courier new,monospace">rect(bottomLeft: point, =
size)</font>case=C2=A0</div><div>and often they label multiple arguments li=
ke the case here and all &quot;in-place&quot;-like constructors in std.</di=
v><div><br></div><div><div>The designer is also free to accept <font face=
=3D"courier new,monospace" style=3D"border-bottom-color:rgb(34,34,34);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34)=
;border-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,=
34);border-right-style:none;border-right-width:0px;border-top-color:rgb(34,=
34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px">std::pair</font> instead, forcing a mo=
re explicit call - <font face=3D"courier new,monospace" style=3D"border-bot=
tom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bo=
rder-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;=
border-right-color:rgb(34,34,34);border-right-style:none;border-right-width=
:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:=
0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">Point(car=
tesian: {5.7, 1.2});</font></div><div><font face=3D"arial,sans-serif" style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px">or, in more complex cases, he can add another label to break parameter=
 &quot;packs&quot;.</font></div><div><font face=3D"arial,sans-serif"></font=
><br></div></div><div>Lastly, one is free to use a comma after the label - =
<span style=3D"display:inline!important;float:none;background-color:transpa=
rent;color:rgb(34,34,34);font-family:courier new,monospace;font-size:13px;f=
ont-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;=
text-align:left;text-decoration:none;text-indent:0px;text-transform:none;wh=
ite-space:normal;word-spacing:0px">Point(cartesian:, 5.7, 1.2);<font face=
=3D"arial,sans-serif"> so to be more specific.</font></span></div><div><fon=
t face=3D"courier new,monospace">=C2=A0</font><font face=3D"courier new,mon=
ospace"><br></font></div><div><b></b><i></i><u></u><sub></sub><sup></sup><s=
trike></strike><br></div><div>And don&#39;t forget<font face=3D"courier new=
,monospace"> Point::<span style=3D"text-align:left;color:rgb(34,34,34);text=
-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px;font-s=
tyle:normal;font-variant:normal;font-weight:400;text-decoration:none;word-s=
pacing:0px;display:inline!important;white-space:normal;float:none;backgroun=
d-color:transparent">cartesian() <font face=3D"arial,sans-serif">is not any=
 better! Not by a long shot.</font></span></font></div><div><font face=3D"c=
ourier new,monospace"><span style=3D"text-align:left;color:rgb(34,34,34);te=
xt-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px;font=
-style:normal;font-variant:normal;font-weight:400;text-decoration:none;word=
-spacing:0px;display:inline!important;white-space:normal;float:none;backgro=
und-color:transparent"><font face=3D"arial,sans-serif">If this is to be don=
e right it should be following a convention like the Qt&#39;s &quot;from&qu=
ot; one=C2=A0 - </font>fromCartesian(. . .)-<font face=3D"arial,sans-serif"=
> j</font></span></font><span style=3D"text-align:left;color:rgb(34,34,34);=
text-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px;fo=
nt-style:normal;font-variant:normal;font-weight:400;text-decoration:none;wo=
rd-spacing:0px;display:inline!important;white-space:normal;float:none;backg=
round-color:transparent"><font face=3D"arial,sans-serif">ust a floating sta=
tic function with the name &#39;<span style=3D"margin:0px;padding:0px;borde=
r:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34);text-transform:none=
;text-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal;fon=
t-variant:normal;font-weight:400;text-decoration:none;word-spacing:0px;disp=
lay:inline;white-space:normal;float:none;background-color:transparent">cart=
esian&#39; means little without documentation.=C2=A0</span></font></span><s=
pan style=3D"text-align:left;color:rgb(34,34,34);text-transform:none;text-i=
ndent:0px;letter-spacing:normal;font-size:13px;font-style:normal;font-varia=
nt:normal;font-weight:400;text-decoration:none;word-spacing:0px;display:inl=
ine!important;white-space:normal;float:none;background-color:transparent"><=
span style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:le=
ft;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:n=
ormal;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;=
text-decoration:none;word-spacing:0px;display:inline;white-space:normal;flo=
at:none;background-color:transparent"><br></span></span></div><div><span st=
yle=3D"text-align:left;color:rgb(34,34,34);text-transform:none;text-indent:=
0px;letter-spacing:normal;font-size:13px;font-style:normal;font-variant:nor=
mal;font-weight:400;text-decoration:none;word-spacing:0px;display:inline!im=
portant;white-space:normal;float:none;background-color:transparent"><span s=
tyle=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:left;col=
or:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:normal;=
font-size:13px;font-style:normal;font-variant:normal;font-weight:400;text-d=
ecoration:none;word-spacing:0px;display:inline;white-space:normal;float:non=
e;background-color:transparent"><font face=3D"arial,sans-serif">At least as=
 label the user can deduce, it is </font>not <font face=3D"arial,sans-serif=
">about the first variable as &quot;a cartesian float&quot; does not mean a=
nything, neither does &quot;polar float&quot;.=C2=A0</font></span></span></=
div><div><span style=3D"text-align:left;color:rgb(34,34,34);text-transform:=
none;text-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal=
;font-variant:normal;font-weight:400;text-decoration:none;word-spacing:0px;=
display:inline!important;white-space:normal;float:none;background-color:tra=
nsparent"><span style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);te=
xt-align:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;lette=
r-spacing:normal;font-size:13px;font-style:normal;font-variant:normal;font-=
weight:400;text-decoration:none;word-spacing:0px;display:inline;white-space=
:normal;float:none;background-color:transparent"><font face=3D"arial,sans-s=
erif"></font><br></span></span></div><div><span style=3D"text-align:left;co=
lor:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:normal=
;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;text-=
decoration:none;word-spacing:0px;display:inline!important;white-space:norma=
l;float:none;background-color:transparent"><font face=3D"arial,sans-serif">=
<span style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:l=
eft;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:=
normal;font-size:13px;font-style:normal;font-variant:normal;font-weight:400=
;text-decoration:none;word-spacing:0px;display:inline;white-space:normal;fl=
oat:none;background-color:transparent">Also, in reality &quot;<span style=
=3D"background-color:transparent;border-bottom-color:rgb(34,34,34);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);bo=
rder-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34)=
;border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,=
34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34);display:=
inline;float:none;font-family:courier new,monospace;font-size:13px;font-sty=
le:normal;font-variant:normal;font-weight:400;letter-spacing:normal;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px;text-align:left;text-=
decoration:none;text-indent:0px;text-transform:none;white-space:normal;word=
-spacing:0px"><font face=3D"arial,sans-serif">cartesian&quot;</font> <font =
face=3D"arial,sans-serif">should be implicit. The user will ever have to sp=
ecify only &quot;polar: . . .&quot;, as it is unusual.</font></span></span>=
</font></span></div><div><font face=3D"arial,sans-serif"></font>=C2=A0</div=
><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bord=
er-left:1px #ccc solid;padding-left:1ex"><div><div><p class=3D"MsoNormal"><=
br>Besides, regardless of what can be done for generic<br>code, =E2=80=9Cna=
med constructors=E2=80=9D should at least support<br>the Point::cartesian(5=
..7, 1.2) syntax.<br></p></div></div></blockquote><div><br></div><div><br></=
div><div>Static functions used as named constructors don&#39;t work with te=
mplate argument deduction (along with many other downsides) and we should m=
ove away from them <i>completely</i>.=C2=A0</div><div>The fact we teach and=
 use this idiom for 30 years does not make it a good one - a static functio=
n <i>in no way</i> implies construction.</div></div></blockquote><div><br><=
/div><div>Agree</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div d=
ir=3D"ltr"><div><br></div><div>Static functions have no benefits besides wr=
itten text to the user, something label arguments are capable of doing, not=
 only that, but the text can move around the arguments.</div><div><br></div=
><div>Yes the user will need to learn to read labels, but chances are, one =
will be to deduce the meaning from context, much like one can, most of the =
time, deduce which static functions are &quot;constructors&quot;.</div><div=
><br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"marg=
in:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div><d=
iv><p class=3D"MsoNormal"><br></p><p class=3D"MsoNormal">--<br>Zhihao Yuan,=
 ID lichray<br>The best way to predict the future is to invent it.<br>_____=
__________________________________________</p><p class=3D"MsoNormal">=C2=A0=
</p><div style=3D"border:none;border-left:solid blue 1.5pt;padding:0in 0in =
0in 4.0pt"><div><div style=3D"border:none;border-top:solid #e1e1e1 1.0pt;pa=
dding:3.0pt 0in 0in 0in"><p class=3D"MsoNormal"><b>From:</b> <a rel=3D"nofo=
llow">mihailn...@gmail.com</a> &lt;<a rel=3D"nofollow">mihailn...@gmail.com=
</a>&gt; <br><b>Sent:</b> Monday, July 16, 2018 7:25 AM<br><br></p></div></=
div><div><div><p class=3D"MsoNormal"><span style=3D"font-family:&quot;Couri=
er New&quot;">=C2=A0=C2=A0Point p1 =3D Point(</span><span style=3D"font-siz=
e:10.0pt;font-family:&quot;Courier New&quot;;color:#222222;border:none wind=
owtext 1.0pt;padding:0in">cartesian</span><span style=3D"font-family:&quot;=
Courier New&quot;">: 5.7, 1.2);=C2=A0</span></p><p class=3D"MsoNormal"><spa=
n style=3D"font-family:&quot;Courier New&quot;">=C2=A0 Point p2 =3D Point(p=
olar: 5.7, 1.2);=C2=A0</span></p></div></div></div></div></div></blockquote=
></div></blockquote><div><br></div><div>There&#39;s a problem with this mot=
ivating example.</div><div><br></div><div>A cartesian co-ordinate cannot be=
 converted to a polar co-ordinate without providing the conventions implici=
t in the world geometry.=C2=A0</div><div><br></div><div>For example, is the=
 angle clockwise or anti-clockwise and which axis corresponds to zero degre=
es of rotation?</div><div><br></div><div>You may want to consider:</div><di=
v><br></div><div><font face=3D"monospace, monospace">class Point2d;</font><=
/div><div><font face=3D"monospace, monospace">class Polar2dCoordinate;</fon=
t></div><div><font face=3D"monospace, monospace">class Geometry2d;</font></=
div><div><font face=3D"monospace, monospace"><br></font></div><div><div sty=
le=3D"background-color:rgb(255,255,255);text-decoration-style:initial;text-=
decoration-color:initial"><font face=3D"monospace, monospace">Point2d::Poin=
t2d(<span style=3D"background-color:rgb(255,255,255);text-decoration-style:=
initial;text-decoration-color:initial;float:none;display:inline">Polar2dCoo=
rdinate const&amp;,=C2=A0<span style=3D"text-decoration-style:initial;text-=
decoration-color:initial;float:none;display:inline">Geometry2d const&amp;);=
</span></span></font></div><div style=3D"background-color:rgb(255,255,255);=
text-decoration-style:initial;text-decoration-color:initial"><font face=3D"=
monospace, monospace"><span style=3D"text-decoration-style:initial;text-dec=
oration-color:initial;float:none;display:inline">Polar2dCoordinate</span>::=
<span style=3D"text-decoration-style:initial;text-decoration-color:initial;=
float:none;display:inline">Polar2dCoordinate</span>(<span style=3D"backgrou=
nd-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-col=
or:initial;float:none;display:inline"><span style=3D"text-decoration-style:=
initial;text-decoration-color:initial;float:none;display:inline">Point2d</s=
pan> const&amp;,=C2=A0<span style=3D"text-decoration-style:initial;text-dec=
oration-color:initial;float:none;display:inline">Geometry2d const&amp;);</s=
pan></span></font></div><br class=3D"gmail-Apple-interchange-newline">Or si=
milar conversion functions.</div><div><br></div><div>This has the advantage=
 of being self-documenting doesn&#39;t it?</div><div>=C2=A0<br></div><block=
quote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc=
 solid;padding-left:1ex">

<p></p>

-- <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" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/cfef3371-ce08-4e72-97ad-4328333be859%=
40isocpp.org?utm_medium=3Demail&amp;utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/cfef3371-ce08-=
4e72-97ad-4328333be859%40isocpp.org</a>.<br>
</blockquote></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CALvx3hZxSCT74nYccMg0j3f%3Dii3xHPExLQ=
pwubusRveiL-_OBg%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3hZxSCT74n=
YccMg0j3f%3Dii3xHPExLQpwubusRveiL-_OBg%40mail.gmail.com</a>.<br />

--00000000000016cec4057122b661--

.


Author: cppljevans@gmail.com
Date: Mon, 16 Jul 2018 14:45:20 -0700 (PDT)
Raw View
------=_Part_118035_1612483401.1531777520457
Content-Type: multipart/alternative;
 boundary="----=_Part_118036_1611251449.1531777520458"

------=_Part_118036_1611251449.1531777520458
Content-Type: text/plain; charset="UTF-8"



On Monday, July 16, 2018 at 7:25:24 AM UTC-5, mihailn...@gmail.com wrote:
>
> This is a continuation of
> https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I
>
> To recap the problem itself, here is the c++FAQ entry about it
> http://www.cs.technion.ac.il/users/yechiel/c++-faq/named-ctor-idiom.html
>
>
> Sidenote. Some will argue the problem is most correctly solved by
>> introducing new type(s).
>
> In that particular case this might be true, but that is not always the
>> case - often a new type is not the best solution,
>
> either because the type would be completely superficial or because it is
>> not feasible to introduce and maintain dozens of types, not used outside a
>> limited context.
>
>
>
> *Part 1: Intro*
>
> This topic suggests building upon the tag idiom, already used throughout
> std, to enable "named constructors" by a way of "label arguments"
>
> Here are the improvements over the idiom
>
>    - provide a trivial way to create tag arguments (label arguments)
>    - provide out-of-the-box way for the labels not to interfere with the
>    rest of the types and the variables
>    - provide ways for the labels to "just work" on the call site with the
>    least qualification possible
>    - provide syntax for the labels to be visually district from regular
>    arguments (which gives invaluable semantic context to the reader of the
>    code)
>    - provide a way the labels to look the same on the declaration and on
>    the call site (WYSIWYG)
>
> If these points are done right, in a way, we have an enabling technology -
> a better way to create interfaces.
> interfaces that are not less expressive then named functions, while still
> working well with other key language features like constructors and
> template metaprogramming.
>
> Without further ado, lets solve the problem c++faq presented using label
> arguments.
>
> class Point
> {
> public:
>   case struct cartesian;
>   case struct polar;
>
>   Point(case cartesian, float x, float y) {. . .}
>   Point(case polar, float r, float a) {. . .}
> };
>
> int main()
> {
>   Point p1 = Point(cartesian: 5.7, 1.2);
>   Point p2 = Point(polar: 5.7, 1.2);
>
>   return 0;
> }
>
> That's it.
>
[snip]
 A small bit of bikeshedding: Why violate DRY {Don't Repeat Yourself}
by repeating case and struct?  Why not, instead, use:

public:
     case
     { cartesian
     , polar
     };
?

--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/55b3ca35-4bdc-4889-9900-7409905f6ed4%40isocpp.org.

------=_Part_118036_1611251449.1531777520458
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Monday, July 16, 2018 at 7:25:24 AM UTC-5, miha=
iln...@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0=
;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div di=
r=3D"ltr"><div>This is a continuation of=C2=A0<a href=3D"https://groups.goo=
gle.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I" target=3D"_bl=
ank" rel=3D"nofollow" onmousedown=3D"this.href=3D&#39;https://groups.google=
..com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I&#39;;return true;=
" onclick=3D"this.href=3D&#39;https://groups.google.com/a/isocpp.org/forum/=
#!topic/std-proposals/O6rLutWGp4I&#39;;return true;">https://groups.google.=
com/<wbr>a/isocpp.org/forum/#!topic/<wbr>std-proposals/O6rLutWGp4I</a></div=
><div><br></div><div><span style=3D"display:inline!important;float:none;bac=
kground-color:transparent;color:rgb(34,34,34);font-family:&quot;Arial&quot;=
,&quot;Helvetica&quot;,sans-serif;font-size:13px;font-style:normal;font-var=
iant:normal;font-weight:400;letter-spacing:normal;text-align:left;text-deco=
ration:none;text-indent:0px;text-transform:none;white-space:normal;word-spa=
cing:0px">To recap the problem itself, here is the c++FAQ entry about it <a=
 href=3D"http://www.cs.technion.ac.il/users/yechiel/c++-faq/named-ctor-idio=
m.html" target=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D&#39;=
http://www.google.com/url?q\x3dhttp%3A%2F%2Fwww.cs.technion.ac.il%2Fusers%2=
Fyechiel%2Fc%2B%2B-faq%2Fnamed-ctor-idiom.html\x26sa\x3dD\x26sntz\x3d1\x26u=
sg\x3dAFQjCNEeN_j0krdo5JSzmRCo2gND43nBEQ&#39;;return true;" onclick=3D"this=
..href=3D&#39;http://www.google.com/url?q\x3dhttp%3A%2F%2Fwww.cs.technion.ac=
..il%2Fusers%2Fyechiel%2Fc%2B%2B-faq%2Fnamed-ctor-idiom.html\x26sa\x3dD\x26s=
ntz\x3d1\x26usg\x3dAFQjCNEeN_j0krdo5JSzmRCo2gND43nBEQ&#39;;return true;">ht=
tp://www.cs.technion.ac.il/<wbr>users/yechiel/c++-faq/named-<wbr>ctor-idiom=
..html</a></span><br></div><div><br></div><div><div><br></div><blockquote cl=
ass=3D"gmail_quote">Sidenote. Some will argue the problem is most correctly=
 solved by introducing new type(s). =C2=A0</blockquote><blockquote class=3D=
"gmail_quote">In that particular case this might be true, but that is not a=
lways the case - often a new type is not the best solution, =C2=A0</blockqu=
ote><blockquote class=3D"gmail_quote">either because the type would be comp=
letely superficial or because it is not feasible to introduce and maintain =
dozens of types, not used outside a limited context.</blockquote><div>=C2=
=A0</div><div><br></div><div><b>Part 1: Intro</b></div><div><b></b><br></di=
v><div>This topic suggests building upon the tag idiom, already used throug=
hout std, to enable &quot;named constructors&quot; by a way of &quot;label =
arguments&quot;</div></div><div><br></div><div>Here are the improvements ov=
er the idiom</div><ul><li>provide a trivial way to create tag arguments (la=
bel arguments)</li><li>provide out-of-the-box way for the labels not to int=
erfere with the rest of the types and the variables</li><li>provide ways fo=
r the labels to &quot;just work&quot; on the call site with the least quali=
fication possible</li><li>provide syntax for the labels to be visually dist=
rict from regular arguments (which gives invaluable semantic context to the=
 reader of the code)</li><li>provide a way the labels to look the same on t=
he declaration and on the call site (WYSIWYG)</li></ul><div>If these points=
 are done right, in a way, we have an enabling technology - a better way to=
 create interfaces.=C2=A0</div><div>interfaces that are not less expressive=
 then named functions, while still working well with other key language fea=
tures like constructors and template metaprogramming.</div><div><br></div><=
div>Without further ado, lets solve the problem c++faq presented using labe=
l arguments.</div><div><br></div><div><font face=3D"courier new,monospace">=
 class Point=C2=A0</font></div><div><font face=3D"courier new,monospace">{<=
br></font></div><div><font face=3D"courier new,monospace">public:</font></d=
iv><div><font face=3D"courier new,monospace">=C2=A0=C2=A0<span style=3D"dis=
play:inline!important;float:none;background-color:transparent;color:rgb(34,=
34,34);font-family:courier new,monospace;font-size:13px;font-style:normal;f=
ont-variant:normal;font-weight:400;letter-spacing:normal;text-align:left;te=
xt-decoration:none;text-indent:0px;text-transform:none;white-space:normal;w=
ord-spacing:0px">case struct cartesian;</span></font></div><div><font face=
=3D"courier new,monospace">=C2=A0 case struct polar;</font></div><div><font=
 face=3D"courier new,monospace"><br></font></div><font face=3D"courier new,=
monospace">=C2=A0 Point(case <span style=3D"display:inline!important;float:=
none;background-color:transparent;color:rgb(34,34,34);font-family:courier n=
ew,monospace;font-size:13px;font-style:normal;font-variant:normal;font-weig=
ht:400;letter-spacing:normal;text-align:left;text-decoration:none;text-inde=
nt:0px;text-transform:none;white-space:normal;word-spacing:0px">cartesian, =
</span>float x, float y) {. . .}<br>=C2=A0 Point(case polar, float r, float=
 a) {. . .}<br>};</font><div><b></b><i></i><u></u><sub></sub><sup></sup><st=
rike></strike><br></div><font face=3D"courier new,monospace">int main()<br>=
{<br>=C2=A0 Point p1 =3D Point(<span style=3D"background-color:transparent;=
border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-wi=
dth:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-=
width:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-=
top-width:0px;color:rgb(34,34,34);display:inline;float:none;font-family:cou=
rier new,monospace;font-size:13px;font-style:normal;font-variant:normal;fon=
t-weight:400;letter-spacing:normal;margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px;text-align:left;text-decoration:none;text-indent:0px;t=
ext-transform:none;white-space:normal;word-spacing:0px">cartesian</span>: 5=
..7, 1.2);=C2=A0<br><div>=C2=A0 Point p2 =3D Point(polar: 5.7, 1.2);=C2=A0</=
div><div><br></div><div>=C2=A0 <span style=3D"display:inline!important;floa=
t:none;background-color:transparent;color:rgb(34,34,34);font-family:courier=
 new,monospace;font-size:13px;font-style:normal;font-variant:normal;font-we=
ight:400;letter-spacing:normal;text-align:left;text-decoration:none;text-in=
dent:0px;text-transform:none;white-space:normal;word-spacing:0px">return 0;=
</span></div></font><div><font face=3D"courier new,monospace">}</font></div=
><div><font face=3D"courier new,monospace"><br></font></div><div><font face=
=3D"arial,sans-serif">That&#39;s it.</font></div></div></blockquote><div>[s=
nip] <br></div><div>=C2=A0A small bit of bikeshedding: Why violate DRY {Don=
&#39;t Repeat Yourself}
<br>by repeating case and struct?=C2=A0 Why not, instead, use:
<br>
</div><div><br></div><div>public:<br>=C2=A0=C2=A0=C2=A0=C2=A0 case
<br>=C2=A0=C2=A0=C2=A0=C2=A0 { cartesian
<br>=C2=A0=C2=A0=C2=A0=C2=A0 , polar
<br>=C2=A0=C2=A0=C2=A0=C2=A0 };
<br>?
</div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/55b3ca35-4bdc-4889-9900-7409905f6ed4%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/55b3ca35-4bdc-4889-9900-7409905f6ed4=
%40isocpp.org</a>.<br />

------=_Part_118036_1611251449.1531777520458--

------=_Part_118035_1612483401.1531777520457--

.


Author: Zhihao Yuan <zy@miator.net>
Date: Mon, 16 Jul 2018 18:11:24 -0400
Raw View
This is a multi-part message in MIME format.

--b1_751856376bb306d5d1e8c5a32e3844a2
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

I had never said that this syntax is static functions, I only
said that your feature should be able to be used with that
syntax.

--
Zhihao Yuan, ID lichray
The best way to predict the future is to invent it.
_______________________________________________

From: mihailnajdenov@gmail.com <mihailnajdenov@gmail.com>
Sent: Monday, July 16, 2018 1:54 PM

Besides, regardless of what can be done for generic
code, =E2=80=9Cnamed constructors=E2=80=9D should at least support
the Point::cartesian(5.7, 1.2) syntax.

Static functions used as named constructors don't work with template argume=
nt deduction (along with many other downsides) and we should move away from=
 them completely.

The fact we teach and use this idiom for 30 years does not make it a good o=
ne - a static function in no way implies construction.

Static functions have no benefits besides written text to the user, somethi=
ng label arguments are capable of doing, not only that, but the text can mo=
ve around the arguments.

--=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.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/xqkfu8BoBrfGqEDVMSBPq4I2BhtRLq1bFEl8X5OJgZS8zFUV=
_-Y0G6bGK9s6qIG9kaxAW7zkV3xQ1VnlGAMVNrB4__Utp5FAL9gaMOsBF-w%3D%40miator.net=
..

--b1_751856376bb306d5d1e8c5a32e3844a2
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<html><head></head><body><div class=3D"WordSection1"><p class=3D"MsoNormal"=
>I had never said that this syntax <b>is</b> static functions, I only<br/>s=
aid that your feature should be able to be used with that<br/>syntax.<o:p><=
/o:p></p><p class=3D"MsoNormal"><o:p>=C2=A0</o:p></p><p class=3D"MsoNormal"=
>--<br/>Zhihao Yuan, ID lichray<br/>The best way to predict the future is t=
o invent it.<br/>_______________________________________________<o:p></o:p>=
</p><p class=3D"MsoNormal"><o:p>=C2=A0</o:p></p><div style=3D"border:none;b=
order-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt"><div><div style=3D"b=
order:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in"><p cla=
ss=3D"MsoNormal" style=3D"margin-left:5.25pt"><b>From:</b> mihailnajdenov@g=
mail.com &lt;mihailnajdenov@gmail.com&gt; <br/><b>Sent:</b> Monday, July 16=
, 2018 1:54 PM<br/><br/><o:p></o:p></p><p class=3D"MsoNormal" style=3D"marg=
in-left:5.25pt">Besides, regardless of what can be done for generic<br/>cod=
e, =E2=80=9Cnamed constructors=E2=80=9D should at least support<br/>the Poi=
nt::cartesian(5.7, 1.2) syntax.<o:p></o:p></p></div></div><div><div><p clas=
s=3D"MsoNormal"><o:p>=C2=A0</o:p></p></div><div><p class=3D"MsoNormal">Stat=
ic functions used as named constructors don&#39;t work with template argume=
nt deduction (along with many other downsides) and we should move away from=
 them <i>completely</i>.=C2=A0<o:p></o:p></p></div><div><p class=3D"MsoNorm=
al">The fact we teach and use this idiom for 30 years does not make it a go=
od one - a static function <i>in no way</i> implies construction.<o:p></o:p=
></p></div><div><p class=3D"MsoNormal"><o:p>=C2=A0</o:p></p></div><div><p c=
lass=3D"MsoNormal">Static functions have no benefits besides written text t=
o the user, something label arguments are capable of doing, not only that, =
but the text can move around the arguments.<o:p></o:p></p></div></div></div=
></div></body></html>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/xqkfu8BoBrfGqEDVMSBPq4I2BhtRLq1bFEl8X=
5OJgZS8zFUV_-Y0G6bGK9s6qIG9kaxAW7zkV3xQ1VnlGAMVNrB4__Utp5FAL9gaMOsBF-w%3D%4=
0miator.net?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/xqkfu8BoBrfGqEDVMSBPq4I2BhtRLq1bFEl8X=
5OJgZS8zFUV_-Y0G6bGK9s6qIG9kaxAW7zkV3xQ1VnlGAMVNrB4__Utp5FAL9gaMOsBF-w%3D%4=
0miator.net</a>.<br />

--b1_751856376bb306d5d1e8c5a32e3844a2--


.


Author: mihailnajdenov@gmail.com
Date: Tue, 17 Jul 2018 11:30:06 -0700 (PDT)
Raw View
------=_Part_15823_1580167629.1531852207072
Content-Type: multipart/alternative;
 boundary="----=_Part_15824_166775872.1531852207072"

------=_Part_15824_166775872.1531852207072
Content-Type: text/plain; charset="UTF-8"

Richard, I agree with you in general, but that is the example c++faq gives
and I wanted to just compare and contrast.
They just included a minimal, nalive if you will, dummy system, just for
example.

In any case, types are the right solution for this example on multiple
occasions.
Even if we keep their scenario, 'angle' can be a different type as it is
not assignable to a coordinate like x and y.


About cpplj... suggestion

I actually like the idea for reasons, completely different - this makes it
clear we are introducing a scope, and that is a good thing.

Having said that, this will rise issues of its own - is this really a
namespace, if yes, they why only one type of thing can be declared there
and why it can be placed inside a class,
if not, then why it can be reopened and behave pretty much like namespace
in all other cases; should be called "case namespace"?
I am not against the idea, and I will suggest it as an alternative/future
improvement, I simply want to be as conservative as possible at the moment.


Zhihao, I am afraid, don't see how the two are connected and how can we
reinforce that connection. Which label should be callable as function name?
Should this apply to functions as well.
Why are we obligated to provide such alternative? What do we gain?


--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/24a3d63a-6512-4ef0-9411-a4cabf8110e6%40isocpp.org.

------=_Part_15824_166775872.1531852207072
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>Richard, I agree with you in general, but that is the=
 example c++faq gives and I wanted to just compare and contrast.</div><div>=
They just included a minimal, nalive if you will, dummy system, just for ex=
ample.</div><div><br></div><div>In any case, types are the right solution f=
or this example on multiple occasions.=C2=A0</div><div>Even if we keep thei=
r scenario, &#39;angle&#39; can be a different type as it is not assignable=
 to a coordinate like x and y.</div><div><br></div><div><br></div><div>Abou=
t cpplj... suggestion</div><div><br></div><div>I actually like the idea for=
 reasons, completely different - this makes it clear we are introducing a s=
cope, and that is a good thing.=C2=A0<br></div><div><br></div><div>Having s=
aid that, this will rise issues of its own - is this really a namespace, if=
 yes, they why only one type of thing can be declared there<span style=3D"d=
isplay: inline !important; float: none; background-color: transparent; colo=
r: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sa=
ns-serif; font-size: 13px; font-style: normal; font-variant: normal; font-w=
eight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-deco=
ration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-w=
idth: 0px; white-space: normal; word-spacing: 0px;"> and why it can be plac=
ed inside a class</span>,=C2=A0</div><div>if not, then why it can be reopen=
ed and behave pretty much like namespace in all other cases; should be call=
ed &quot;case namespace&quot;?</div><div>I am not against the idea, and I w=
ill suggest it as an alternative/future improvement, I simply want to be as=
 conservative as possible at the moment.=C2=A0</div><div><br></div><div><br=
></div><div>Zhihao, I am afraid, don&#39;t see how the two are connected an=
d how can we reinforce that connection. Which label should be callable as f=
unction name? Should this apply to functions as well.</div><div><span style=
=3D"display: inline !important; float: none; background-color: transparent;=
 color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quo=
t;,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; f=
ont-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text=
-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-str=
oke-width: 0px; white-space: normal; word-spacing: 0px;"> Why are we obliga=
ted to provide such alternative? </span>What do we gain?</div><div><br></di=
v><div><br></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/24a3d63a-6512-4ef0-9411-a4cabf8110e6%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/24a3d63a-6512-4ef0-9411-a4cabf8110e6=
%40isocpp.org</a>.<br />

------=_Part_15824_166775872.1531852207072--

------=_Part_15823_1580167629.1531852207072--

.


Author: Richard Hodges <hodges.r@gmail.com>
Date: Thu, 19 Jul 2018 10:57:33 +0200
Raw View
--0000000000006ec3fd0571565f31
Content-Type: text/plain; charset="UTF-8"

Sorry for the top post. Perhaps the group could let me know if this is
worthy of a separate thread.

I actually have a use case in which areas of this proposal would be useful.

I am writing a library which wraps c-style libraries into c++ value-type
objects.

I have a class which acts as an indication that a raw pointer is being
adopted:

namespace wrapper { namespace core {

    template<class T>
    struct adopted_pointer
    {
        adopted_pointer(T *p) noexcept
            : ptr_(p)
        {
        }

        adopted_pointer(adopted_pointer const& other) = delete;

        constexpr adopted_pointer(adopted_pointer&& other) noexcept
            : ptr_(other.ptr_)
        {
            other.ptr_ = nullptr;
        }

        adopted_pointer& operator =(adopted_pointer&& other) = delete;

        adopted_pointer& operator =(adopted_pointer const&& other) = delete;

        ~adopted_pointer() noexcept
        {
            assert(!ptr_);
        }

        T *get()&&
        {
            auto result = ptr_;
            ptr_ = nullptr;
            return result;
        }

        T *ptr_;
    };


There is further function in the wrapper namespace to create such an
adoption indicator:

namespace wrapper {

    using ::wrapper::core::adopted_pointer;

    template<class T>
    auto adopt(T *p) -> adopted_pointer<T>
    {
        return {p};
    }

}


I can now specify explicitly in a constructor that a pointer created in
another library is being adopted (i.e. we are controlling ownership):

auto ps = reinterpret_cast<char*>(std::malloc(100));
std::strcpy(ps, "hello, world");
auto ds = wrapper::core::dynamic_c_string(wrapper::adopt(ps));


The above code is in the global namespace, hence the need to fully qualify
the call to adopt.

What might be nice is to be able to specify:

auto ds = wrapper::core::dynamic_c_string(adopt: ps);


Which in effect means 'search for the name 'adopt' in the callee's
namespace rather than the caller's.

I think there is a reasonable argument for exploring this use case.

R

On Mon, 16 Jul 2018 at 14:25, <mihailnajdenov@gmail.com> wrote:

> This is a continuation of
> https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I
>
> To recap the problem itself, here is the c++FAQ entry about it
> http://www.cs.technion.ac.il/users/yechiel/c++-faq/named-ctor-idiom.html
>
>
> Sidenote. Some will argue the problem is most correctly solved by
>> introducing new type(s).
>
> In that particular case this might be true, but that is not always the
>> case - often a new type is not the best solution,
>
> either because the type would be completely superficial or because it is
>> not feasible to introduce and maintain dozens of types, not used outside a
>> limited context.
>
>
>
> *Part 1: Intro*
>
> This topic suggests building upon the tag idiom, already used throughout
> std, to enable "named constructors" by a way of "label arguments"
>
> Here are the improvements over the idiom
>
>    - provide a trivial way to create tag arguments (label arguments)
>    - provide out-of-the-box way for the labels not to interfere with the
>    rest of the types and the variables
>    - provide ways for the labels to "just work" on the call site with the
>    least qualification possible
>    - provide syntax for the labels to be visually district from regular
>    arguments (which gives invaluable semantic context to the reader of the
>    code)
>    - provide a way the labels to look the same on the declaration and on
>    the call site (WYSIWYG)
>
> If these points are done right, in a way, we have an enabling technology -
> a better way to create interfaces.
> interfaces that are not less expressive then named functions, while still
> working well with other key language features like constructors and
> template metaprogramming.
>
> Without further ado, lets solve the problem c++faq presented using label
> arguments.
>
> class Point
> {
> public:
>   case struct cartesian;
>   case struct polar;
>
>   Point(case cartesian, float x, float y) {. . .}
>   Point(case polar, float r, float a) {. . .}
> };
>
> int main()
> {
>   Point p1 = Point(cartesian: 5.7, 1.2);
>   Point p2 = Point(polar: 5.7, 1.2);
>
>   return 0;
> }
>
> That's it.
>
> What do we gain over the static functions? Quite a lot actually
>
>    - No code refactor to transform a constructor to a static function.
>    (no knowledge of static functions for that matter)
>    - Very similar, yet expressive, syntax on the call side
>    - All the benefits of using a constructor:
>       -  Use all the tools that expect a constructor - heap allocation
>       with new , make_*,call construct etc.
>       -  Use all the tools metaprogramming gives like SFINAE.
>       -  Self-explanatory what actually creates the object, no
>       documentation or convention needed.
>       -  Take advantage of template deduction guides if necessary.
>
> Each one of these is a considerable win, no matter how one looks at it!
> It is no wonder the tag idiom is adopted in the standard library, lets try
> to implement the above using it.
>
> class Point
> {
> public:
>   struct labels *//< or a namespace outside class*
>   {
>     struct cartesian_t{  explicit cartesian_t() = default; };
>     struct polar_t{  explicit polar_t() = default; };
>
>     inline static constexpr auto cartesian = cartesian_t();
>     inline static constexpr auto polar = polar_t();
>   };
>
>   Point(labels::cartesian_t, float x, float y) {}
>   Point(labels::polar_t, float r, float a) {}
> };
>
> int main()
> {
>   Point p1 = Point(Point::labels::cartesian, 5.7, 1.2);
>   Point p2 = Point(Point::labels::polar, 5.7, 1.2);
>
>   return 0;
> }
>
> Not that bad, or?
> Here are the list of problem with this "by hand" solution
>
> *- First -*
>
> *Experts only!* On the call site it might be "fine", but no junior to
> intermediate programmer will *dare* implementing this interface of its
> own objects.
>
> Dummy class as scope, empty structs, explicit, default, inline, static - we
> used half of the keywords in C++ together with non-obvious idioms like
> empty classes.
>
> At what stage one teaches this to students?
> At what stage one *recommends* this?
> I know the answer - * only if the staff you want to do is even more
> complex! *
>
> But, our case is *trivial**! *This leaves the only practical approach for
> non-experts to be static functions with all their downsides.
>
> Yet, even for experts, the situation is far from ideal.
>
> *- Second -*
>
> There is no association b/w the type present in the declaration and the
> object used on the call site - We have to use a convention.
> The problem with conventions is, they can't be reinforced, and indeed they
> are broken or even non-existent - std::sequenced_policy does not indicate
> in *any* way std::execution::par can be used on the call site.
>
> To use the interface *one must read the documentation*.
>
>
> *- Third -*
>
> There is no way to tell an argument is a tag and not a normal, user-side
> object.
>
> To use the interface *one must read the documentation*.
>
>
> *- Forth -*
>
> Because these are regular types, we must go through hoops to protect
> ageist name collisions both for the type and the object.
>
> This is crucial if we want any form of natural naming on the tags!
>
> For example
>
> class circle;
> //...
> shape(labels::circle_t, . . .); //< object is 'circle'
>
> Here circle is good first choice for *both* a label object name *and* a
> concrete type.
>
> However, if we use qualified names, we lose natural naming almost by
> definition.
> It is a lose-lose situation - we go the extra mile to protect our names,
> and yet if there is a collision, we are not able to use them naturally.
>
>
> - Fifth -
>
> Even with no collision we are forced to use qualified names in many cases
> as the code would be *impossible* for a human to parse correctly
> otherwise.
>
> rect(point pos, size sz);
> rect(labels::center_t, point val, size sz={10,10});
>
> // user
>
> rect(center, {10,10}); *//< which constructor is called? No way to tell
> without tracking 'center' down *
> *                       // to see if it is a tag object or the name of
> some variable of type point*
>
> Of course, the alternative is to use "smart naming".
>
> An example from std:
>
> std::allocator_arg
>
> Hardly the best option. We will return to this example again later.
>
>
> - Sixth -
>
> labels is just a convention, and as with all conventions, it will be
> broken or not be present at all.
>
> If that's not bad enough, we still risk collision this time with the
> scope name itself.
>
>
> Now, before we dive into details, lets see some more examples
>
> case struct center;
> case struct bottomLeft;
>
> struct circle
> {
>   circle(point p, size sz);
>   circle(case bottomLeft, point p, size sz);
> };
>
> case struct circle;
> case struct rect;
>
> struct shape
> {
>   template<class... Args>
>   shape(case circle, Args&&...); *//< "in-place" construct a circle as
> shape*
>   shape(circle, color);  *//< *from object of type circle
>
>   template<class... Args>
>   shape(case rect, Args&&...); *//< **"in-place" **overload for rect*
> };
>
> // usage highlights
>
> const auto circle = mycircle();
> shape(circle, red); //< as usual, from object of type circle
>
> shape(circle: bottomLeft: p, sz); *//< calling implicit "named
> constructor" for circle - impossible with static functions!*
>
> auto sh = std::make_shared<shape>(circle: p, sz); *//< yep, it works -
> the label is not part of the name of the function!*
>
> Also note, we can build any shape using SFINAE.
>
>
> The usefulness of this idiom is by no means limited to constructors.
>
> We can imagine
>
> write(Data);
> write(case noCommit, Data);
>
> This is more then valuable alternative to any of the current methods - a
> bool argument, an enum argument or a different function name.
> For a real word example one should look no further then parallel stl.
>
> Lets return to constructors
>
> Label arguments are transparent to the type system once bound to a
> typename.
> As a result template argument deduction just works, again, something
> *impossible* with static functions.
>

--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3hbzZG%3DK1z49Zozygq_%2BwU6aXpG28w%3D1EVm43LX%3Duces%2BQ%40mail.gmail.com.

--0000000000006ec3fd0571565f31
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Sorry for the top post. Perhaps the group could let me kno=
w if this is worthy of a separate thread.<div><br></div><div>I actually hav=
e a use case in which areas of this proposal would be useful.</div><div><br=
></div><div>I am writing a library which wraps c-style libraries into c++ v=
alue-type objects.</div><div><br></div><div>I have a class which acts as an=
 indication that a raw pointer is being adopted:</div><div><br></div><div><=
pre style=3D"background-color:rgb(43,43,43);color:rgb(169,183,198);font-fam=
ily:Menlo;font-size:9pt"><span style=3D"color:rgb(204,120,50);font-weight:b=
old">namespace </span>wrapper { <span style=3D"color:rgb(204,120,50);font-w=
eight:bold">namespace </span>core {<br><br>    <span style=3D"color:rgb(204=
,120,50);font-weight:bold">template</span>&lt;<span style=3D"color:rgb(204,=
120,50);font-weight:bold">class </span>T&gt;<br>    <span style=3D"color:rg=
b(204,120,50);font-weight:bold">struct </span>adopted_pointer<br>    {<br> =
       adopted_pointer(T *p) <span style=3D"color:rgb(204,120,50);font-weig=
ht:bold">noexcept<br></span><span style=3D"color:rgb(204,120,50);font-weigh=
t:bold">            </span>: ptr_(p)<br>        {<br>        }<br><br>     =
   adopted_pointer(adopted_pointer <span style=3D"color:rgb(204,120,50);fon=
t-weight:bold">const</span>&amp; other) =3D <span style=3D"color:rgb(204,12=
0,50);font-weight:bold">delete</span><span style=3D"color:rgb(204,120,50)">=
;<br></span><span style=3D"color:rgb(204,120,50)"><br></span><span style=3D=
"color:rgb(204,120,50)">        </span><span style=3D"color:rgb(204,120,50)=
;font-weight:bold">constexpr </span>adopted_pointer(adopted_pointer&amp;&am=
p; other) <span style=3D"color:rgb(204,120,50);font-weight:bold">noexcept<b=
r></span><span style=3D"color:rgb(204,120,50);font-weight:bold">           =
 </span>: ptr_(other.ptr_)<br>        {<br>            other.ptr_ =3D <span=
 style=3D"color:rgb(204,120,50);font-weight:bold">nullptr</span><span style=
=3D"color:rgb(204,120,50)">;<br></span><span style=3D"color:rgb(204,120,50)=
">        </span>}<br><br>        adopted_pointer&amp; <span style=3D"color=
:rgb(204,120,50);font-weight:bold">operator </span>=3D(adopted_pointer&amp;=
&amp; other) =3D <span style=3D"color:rgb(204,120,50);font-weight:bold">del=
ete</span><span style=3D"color:rgb(204,120,50)">;<br></span><span style=3D"=
color:rgb(204,120,50)"><br></span><span style=3D"color:rgb(204,120,50)">   =
     </span>adopted_pointer&amp; <span style=3D"color:rgb(204,120,50);font-=
weight:bold">operator </span>=3D(adopted_pointer <span style=3D"color:rgb(2=
04,120,50);font-weight:bold">const</span>&amp;&amp; other) =3D <span style=
=3D"color:rgb(204,120,50);font-weight:bold">delete</span><span style=3D"col=
or:rgb(204,120,50)">;<br></span><span style=3D"color:rgb(204,120,50)"><br><=
/span><span style=3D"color:rgb(204,120,50)">        </span>~adopted_pointer=
() <span style=3D"color:rgb(204,120,50);font-weight:bold">noexcept<br></spa=
n><span style=3D"color:rgb(204,120,50);font-weight:bold">        </span>{<b=
r>            assert(!ptr_)<span style=3D"color:rgb(204,120,50)">;<br></spa=
n><span style=3D"color:rgb(204,120,50)">        </span>}<br><br>        T *=
get()&amp;&amp;<br>        {<br>            <span style=3D"color:rgb(204,12=
0,50);font-weight:bold">auto </span>result =3D ptr_<span style=3D"color:rgb=
(204,120,50)">;<br></span><span style=3D"color:rgb(204,120,50)">           =
 </span>ptr_ =3D <span style=3D"color:rgb(204,120,50);font-weight:bold">nul=
lptr</span><span style=3D"color:rgb(204,120,50)">;<br></span><span style=3D=
"color:rgb(204,120,50)">            </span><span style=3D"color:rgb(204,120=
,50);font-weight:bold">return </span>result<span style=3D"color:rgb(204,120=
,50)">;<br></span><span style=3D"color:rgb(204,120,50)">        </span>}<br=
><br>        T *ptr_<span style=3D"color:rgb(204,120,50)">;<br></span><span=
 style=3D"color:rgb(204,120,50)">    </span>}<span style=3D"color:rgb(204,1=
20,50)">;<br></span></pre><br></div><div>There is further function in the w=
rapper namespace to create such an adoption indicator:</div><div><br></div>=
<div><pre style=3D"background-color:rgb(43,43,43);color:rgb(169,183,198);fo=
nt-family:Menlo;font-size:9pt"><span style=3D"color:rgb(204,120,50);font-we=
ight:bold">namespace </span>wrapper {<br><br>    <span style=3D"color:rgb(2=
04,120,50);font-weight:bold">using </span>::wrapper::core::adopted_pointer<=
span style=3D"color:rgb(204,120,50)">;<br></span><span style=3D"color:rgb(2=
04,120,50)"><br></span><span style=3D"color:rgb(204,120,50)">    </span><sp=
an style=3D"color:rgb(204,120,50);font-weight:bold">template</span>&lt;<spa=
n style=3D"color:rgb(204,120,50);font-weight:bold">class </span>T&gt;<br>  =
  <span style=3D"color:rgb(204,120,50);font-weight:bold">auto </span>adopt(=
T *p) -&gt; adopted_pointer&lt;T&gt;<br>    {<br>        <span style=3D"col=
or:rgb(204,120,50);font-weight:bold">return </span>{p}<span style=3D"color:=
rgb(204,120,50)">;<br></span><span style=3D"color:rgb(204,120,50)">    </sp=
an>}<br><br>}</pre><br></div><div>I can now specify explicitly in a constru=
ctor that a pointer created in another library is being adopted (i.e. we ar=
e controlling ownership):<br><br><pre style=3D"background-color:rgb(43,43,4=
3);color:rgb(169,183,198);font-family:Menlo;font-size:9pt"><span style=3D"c=
olor:rgb(204,120,50);font-weight:bold">auto </span>ps =3D <span style=3D"co=
lor:rgb(204,120,50);font-weight:bold">reinterpret_cast</span>&lt;<span styl=
e=3D"color:rgb(204,120,50);font-weight:bold">char</span>*&gt;(std::malloc(<=
span style=3D"color:rgb(104,151,187)">100</span>))<span style=3D"color:rgb(=
204,120,50)">;<br></span>std::strcpy(ps<span style=3D"color:rgb(204,120,50)=
">, </span><span style=3D"color:rgb(106,135,89)">&quot;hello, world&quot;</=
span>)<span style=3D"color:rgb(204,120,50)">;<br></span><span style=3D"colo=
r:rgb(204,120,50);font-weight:bold">auto </span>ds =3D wrapper::core::dynam=
ic_c_string(wrapper::adopt(ps))<span style=3D"color:rgb(204,120,50)">;<br><=
/span></pre><br></div><div>The above code is in the global namespace, hence=
 the need to fully qualify the call to adopt.</div><div><br></div><div>What=
 might be nice is to be able to specify:<br><br><pre style=3D"background-co=
lor:rgb(43,43,43);color:rgb(169,183,198);font-family:Menlo;font-size:9pt"><=
span style=3D"color:rgb(204,120,50);font-weight:bold">auto </span>ds =3D wr=
apper::core::dynamic_c_string(adopt: ps)<span style=3D"color:rgb(204,120,50=
)">;<br></span></pre><br></div><div>Which in effect means &#39;search for t=
he name &#39;adopt&#39; in the callee&#39;s namespace rather than the calle=
r&#39;s.</div><div><br></div><div>I think there is a reasonable argument fo=
r exploring this use case.=C2=A0</div><div><br></div><div>R</div></div><br>=
<div class=3D"gmail_quote"><div dir=3D"ltr">On Mon, 16 Jul 2018 at 14:25, &=
lt;<a href=3D"mailto:mihailnajdenov@gmail.com">mihailnajdenov@gmail.com</a>=
&gt; wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 =
0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>T=
his is a continuation of=C2=A0<a href=3D"https://groups.google.com/a/isocpp=
..org/forum/#!topic/std-proposals/O6rLutWGp4I" target=3D"_blank">https://gro=
ups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I</a></di=
v><div><br></div><div><span style=3D"display:inline!important;float:none;ba=
ckground-color:transparent;color:rgb(34,34,34);font-family:&quot;Arial&quot=
;,&quot;Helvetica&quot;,sans-serif;font-size:13px;font-style:normal;font-va=
riant:normal;font-weight:400;letter-spacing:normal;text-align:left;text-dec=
oration:none;text-indent:0px;text-transform:none;white-space:normal;word-sp=
acing:0px">To recap the problem itself, here is the c++FAQ entry about it <=
a href=3D"http://www.cs.technion.ac.il/users/yechiel/c++-faq/named-ctor-idi=
om.html" target=3D"_blank">http://www.cs.technion.ac.il/users/yechiel/c++-f=
aq/named-ctor-idiom.html</a></span><br></div><div><br></div><div><div><br><=
/div><blockquote class=3D"gmail_quote">Sidenote. Some will argue the proble=
m is most correctly solved by introducing new type(s). =C2=A0</blockquote><=
blockquote class=3D"gmail_quote">In that particular case this might be true=
, but that is not always the case - often a new type is not the best soluti=
on, =C2=A0</blockquote><blockquote class=3D"gmail_quote">either because the=
 type would be completely superficial or because it is not feasible to intr=
oduce and maintain dozens of types, not used outside a limited context.</bl=
ockquote><div>=C2=A0</div><div><br></div><div><b>Part 1: Intro</b></div><di=
v><b></b><br></div><div>This topic suggests building upon the tag idiom, al=
ready used throughout std, to enable &quot;named constructors&quot; by a wa=
y of &quot;label arguments&quot;</div></div><div><br></div><div>Here are th=
e improvements over the idiom</div><ul><li>provide a trivial way to create =
tag arguments (label arguments)</li><li>provide out-of-the-box way for the =
labels not to interfere with the rest of the types and the variables</li><l=
i>provide ways for the labels to &quot;just work&quot; on the call site wit=
h the least qualification possible</li><li>provide syntax for the labels to=
 be visually district from regular arguments (which gives invaluable semant=
ic context to the reader of the code)</li><li>provide a way the labels to l=
ook the same on the declaration and on the call site (WYSIWYG)</li></ul><di=
v>If these points are done right, in a way, we have an enabling technology =
- a better way to create interfaces.=C2=A0</div><div>interfaces that are no=
t less expressive then named functions, while still working well with other=
 key language features like constructors and template metaprogramming.</div=
><div><br></div><div>Without further ado, lets solve the problem c++faq pre=
sented using label arguments.</div><div><br></div><div><font face=3D"courie=
r new,monospace"> class Point=C2=A0</font></div><div><font face=3D"courier =
new,monospace">{<br></font></div><div><font face=3D"courier new,monospace">=
public:</font></div><div><font face=3D"courier new,monospace">=C2=A0=C2=A0<=
span style=3D"display:inline!important;float:none;background-color:transpar=
ent;color:rgb(34,34,34);font-family:courier new,monospace;font-size:13px;fo=
nt-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;t=
ext-align:left;text-decoration:none;text-indent:0px;text-transform:none;whi=
te-space:normal;word-spacing:0px">case struct cartesian;</span></font></div=
><div><font face=3D"courier new,monospace">=C2=A0 case struct polar;</font>=
</div><div><font face=3D"courier new,monospace"><br></font></div><font face=
=3D"courier new,monospace">=C2=A0 Point(case <span style=3D"display:inline!=
important;float:none;background-color:transparent;color:rgb(34,34,34);font-=
family:courier new,monospace;font-size:13px;font-style:normal;font-variant:=
normal;font-weight:400;letter-spacing:normal;text-align:left;text-decoratio=
n:none;text-indent:0px;text-transform:none;white-space:normal;word-spacing:=
0px">cartesian, </span>float x, float y) {. . .}<br>=C2=A0 Point(case polar=
, float r, float a) {. . .}<br>};</font><div><b></b><i></i><u></u><sub></su=
b><sup></sup><strike></strike><br></div><font face=3D"courier new,monospace=
">int main()<br>{<br>=C2=A0 Point p1 =3D Point(<span style=3D"background-co=
lor:transparent;border-bottom-color:rgb(34,34,34);border-bottom-style:none;=
border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-sty=
le:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-st=
yle:none;border-top-width:0px;color:rgb(34,34,34);display:inline;float:none=
;font-family:courier new,monospace;font-size:13px;font-style:normal;font-va=
riant:normal;font-weight:400;letter-spacing:normal;margin-bottom:0px;margin=
-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0=
px;padding-right:0px;padding-top:0px;text-align:left;text-decoration:none;t=
ext-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">car=
tesian</span>: 5.7, 1.2);=C2=A0<br><div>=C2=A0 Point p2 =3D Point(polar: 5.=
7, 1.2);=C2=A0</div><div><br></div><div>=C2=A0 <span style=3D"display:inlin=
e!important;float:none;background-color:transparent;color:rgb(34,34,34);fon=
t-family:courier new,monospace;font-size:13px;font-style:normal;font-varian=
t:normal;font-weight:400;letter-spacing:normal;text-align:left;text-decorat=
ion:none;text-indent:0px;text-transform:none;white-space:normal;word-spacin=
g:0px">return 0;</span></div></font><div><font face=3D"courier new,monospac=
e">}</font></div><div><font face=3D"courier new,monospace"><br></font></div=
><div><font face=3D"arial,sans-serif">That&#39;s it.</font></div><div><font=
 face=3D"courier new,monospace"><font face=3D"arial,sans-serif"></font><br>=
</font></div><div><font face=3D"arial,sans-serif">What do we gain over the =
static functions? Quite a lot actually</font></div><font face=3D"arial,sans=
-serif"><ul><li>No code refactor to transform a constructor to a static fun=
ction. (no knowledge of static functions for that matter)</li><li>Very simi=
lar, yet expressive, syntax on the call side</li><li>All the benefits of us=
ing a constructor:</li><ul><li><b>=C2=A0</b>Use all the tools that expect a=
 constructor - heap allocation with <font face=3D"courier new,monospace">ne=
w</font> , <font face=3D"courier new,monospace">make_*,<font face=3D"arial,=
sans-serif">call</font> construct <font face=3D"arial,sans-serif">etc</font=
>.=C2=A0</font></li><li><b>=C2=A0</b>Use all the tools <span style=3D"displ=
ay:inline!important;float:none;background-color:transparent;color:rgb(34,34=
,34);font-family:arial,sans-serif;font-size:13px;font-style:normal;font-var=
iant:normal;font-weight:400;letter-spacing:normal;line-height:17px;text-ali=
gn:left;text-decoration:none;text-indent:0px;text-transform:none;white-spac=
e:normal;word-spacing:0px">metaprogramming gives like</span> SFINAE.=C2=A0<=
/li><li><b>=C2=A0</b>Self-explanatory what actually creates the object, no =
documentation or convention needed.</li><li><b>=C2=A0</b>Take advantage of =
template deduction guides if necessary.</li></ul></ul><div>Each one of thes=
e is a considerable win, no matter how one looks at it!<br></div><div>It is=
 no wonder the tag idiom is adopted in the standard library, lets try to im=
plement the above using it.</div></font><div><font face=3D"courier new,mono=
space"></font><br></div><div><font face=3D"courier new,monospace">class Poi=
nt <br>{<br>public:<br>=C2=A0 struct labels <i>//&lt; or a namespace outsid=
e class</i><br>=C2=A0 {<br>=C2=A0=C2=A0=C2=A0 struct cartesian_t{=C2=A0 exp=
licit cartesian_t() =3D default; };<br>=C2=A0=C2=A0=C2=A0 struct polar_t{=
=C2=A0 explicit polar_t() =3D default; };<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 <br>=C2=A0=C2=A0=C2=A0 inline static constexpr auto cartesian =3D cartesia=
n_t();<br>=C2=A0=C2=A0=C2=A0 inline static constexpr auto polar =3D polar_t=
();<br>=C2=A0 };<br>=C2=A0=C2=A0=C2=A0 </font></div><div><font face=3D"cour=
ier new,monospace">=C2=A0 Point(labels::cartesian_t, float x, float y) {}<b=
r>=C2=A0 Point(labels::polar_t, float r, float a) {}<br>};</font></div><div=
><font face=3D"courier new,monospace"><br></font></div><div><font face=3D"c=
ourier new,monospace">int main()<br>{<br>=C2=A0 Point p1 =3D Point(Point::l=
abels::cartesian, 5.7, 1.2); <br>=C2=A0 Point p2 =3D Point(Point::labels::p=
olar, 5.7, 1.2); <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <br>=C2=A0 =
return 0;<br>}</font><br></div><div><font face=3D"arial,sans-serif"><br></f=
ont></div><div><font face=3D"arial,sans-serif">Not that bad, or?=C2=A0</fon=
t><br></div><div><font face=3D"arial,sans-serif">Here are the list of probl=
em with this &quot;by hand&quot; solution</font></div><div><font face=3D"ar=
ial,sans-serif"><br></font></div><div><font face=3D"arial,sans-serif"><b>- =
First -</b></font></div><div><font face=3D"arial,sans-serif"><b><br></b></f=
ont></div><div><font face=3D"arial,sans-serif"><i>Experts only!</i> On the =
call site it might be &quot;fine&quot;, but no junior to intermediate progr=
ammer will <i><b>dare</b></i> implementing this interface of its own object=
s.=C2=A0</font></div><div><font face=3D"arial,sans-serif"><br></font></div>=
<div><font face=3D"arial,sans-serif">D</font><font face=3D"arial,sans-serif=
">ummy class as scope, empty structs, explicit, default, inline, static - w=
</font><font face=3D"arial,sans-serif">e used half of the keywords in C++ <=
/font>together with <font face=3D"arial,sans-serif">non-obvious idioms like=
 empty classes.</font></div><div><font face=3D"arial,sans-serif"><br></font=
></div><div><font face=3D"arial,sans-serif">At what stage one </font>teache=
s <font face=3D"arial,sans-serif">this to students?<br></font></div><font f=
ace=3D"arial,sans-serif"><div><span style=3D"display:inline!important;float=
:none;background-color:transparent;color:rgb(34,34,34);font-family:arial,sa=
ns-serif;font-size:13px;font-style:normal;font-variant:normal;font-weight:4=
00;letter-spacing:normal;text-align:left;text-decoration:none;text-indent:0=
px;text-transform:none;white-space:normal;word-spacing:0px">At what stage <=
/span>one <i>recommends</i> this?=C2=A0<br></div><div>I know the answer -=
=C2=A0<i> only if the staff you want to do is even more complex!=C2=A0</i><=
/div><div><i><br></i></div></font><div><font face=3D"arial,sans-serif">But,=
 our case is <i>trivial</i></font><i>! </i><font face=3D"arial,sans-serif">=
This leaves the only practical approach for non-experts to be static functi=
ons with all their downsides.=C2=A0</font></div><div><font face=3D"arial,sa=
ns-serif"><br></font></div><font face=3D"arial,sans-serif"><div>Y<span styl=
e=3D"display:inline!important;float:none;background-color:transparent;color=
:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;font-style:norma=
l;font-variant:normal;font-weight:400;letter-spacing:normal;text-align:left=
;text-decoration:none;text-indent:0px;text-transform:none;white-space:norma=
l;word-spacing:0px">et, even for experts, the situation is far from ideal.<=
/span><br></div></font><div><font face=3D"arial,sans-serif"><b></b><i></i><=
u></u><sub></sub><sup></sup><strike></strike><br></font></div><div><font fa=
ce=3D"arial,sans-serif"><b>- Second -</b></font><br></div><div><font face=
=3D"arial,sans-serif"><br></font></div><div><font face=3D"arial,sans-serif"=
>There is no association b/w the type present in the declaration and the ob=
ject used on the call site - We have to use a convention.</font></div><div>=
<font face=3D"arial,sans-serif">The problem with conventions is, they can&#=
39;t be reinforced, and indeed they are broken or even non-existent - <font=
 face=3D"courier new,monospace">std::</font><span style=3D"text-align:left;=
color:rgb(0,0,0);text-transform:none;line-height:14.08px;text-indent:0px;le=
tter-spacing:normal;font-size:12.8px;font-style:normal;font-variant:normal;=
font-weight:400;text-decoration:none;word-spacing:0px;display:inline!import=
ant;white-space:nowrap;float:none;background-color:transparent"><font face=
=3D"courier new,monospace">sequenced_policy</font> does not indicate in <b>=
any</b> way <font face=3D"courier new,monospace">std::execution::par </font=
>can be used on the call site.</span></font></div><div><font face=3D"arial,=
sans-serif"><span style=3D"text-align:left;color:rgb(0,0,0);text-transform:=
none;line-height:14.08px;text-indent:0px;letter-spacing:normal;font-size:12=
..8px;font-style:normal;font-variant:normal;font-weight:400;text-decoration:=
none;word-spacing:0px;display:inline!important;white-space:nowrap;float:non=
e;background-color:transparent"><br></span></font></div>To use the interfac=
e <i>one must read the documentation</i>.=C2=A0<div><font face=3D"arial,san=
s-serif"><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><b></b=
><i></i><u></u><sub></sub><sup></sup><strike></strike><font face=3D"courier=
 new,monospace"></font><font face=3D"courier new,monospace"></font><font co=
lor=3D"#b00000"></font><br></font></div><div><font face=3D"arial,sans-serif=
"><br></font></div><div><font face=3D"arial,sans-serif"><div><font face=3D"=
arial,sans-serif" style=3D"border-bottom-color:rgb(34,34,34);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-l=
eft-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bo=
rder-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;=
margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding=
-right:0px;padding-top:0px"><b style=3D"background-clip:border-box;backgrou=
nd-color:transparent;background-image:none;background-origin:padding-box;ba=
ckground-repeat:repeat;background-size:auto;border-bottom-color:rgb(34,34,3=
4);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(3=
4,34,34);border-left-style:none;border-left-width:0px;border-right-color:rg=
b(34,34,34);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,3=
4);font-family:arial,sans-serif;font-size:13px;height:auto;margin-bottom:0p=
x;margin-left:0px;margin-right:0px;margin-top:0px;min-width:0px;overflow:vi=
sible;overflow-x:visible;overflow-y:visible;padding-bottom:0px;padding-left=
:0px;padding-right:0px;padding-top:0px">- Third -</b></font></div><div><fon=
t face=3D"arial,sans-serif" style=3D"border-bottom-color:rgb(34,34,34);bord=
er-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34=
);border-left-style:none;border-left-width:0px;border-right-color:rgb(34,34=
,34);border-right-style:none;border-right-width:0px;border-top-color:rgb(34=
,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin=
-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0=
px;padding-right:0px;padding-top:0px"><b style=3D"background-clip:border-bo=
x;background-color:transparent;background-image:none;background-origin:padd=
ing-box;background-repeat:repeat;background-size:auto;border-bottom-color:r=
gb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:r=
gb(34,34,34);font-family:arial,sans-serif;font-size:13px;height:auto;margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;min-width:0px;o=
verflow:visible;overflow-x:visible;overflow-y:visible;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"background-c=
lip:border-box;background-color:transparent;background-image:none;backgroun=
d-origin:padding-box;background-repeat:repeat;background-size:auto;border-b=
ottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-widt=
h:0px;color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;heigh=
t:auto;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;mi=
n-width:0px;overflow:visible;overflow-x:visible;overflow-y:visible;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></b></font><=
/div><div><font face=3D"arial,sans-serif" style=3D"border-bottom-color:rgb(=
34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-colo=
r:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-c=
olor:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-to=
p-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bot=
tom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px">There is no way to tell=
 an argument is a tag and not a normal, user-side object.</font></div><div>=
<font face=3D"arial,sans-serif" style=3D"border-bottom-color:rgb(34,34,34);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,3=
4,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(3=
4,34,34);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px"><span style=3D"background-color:t=
ransparent;border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-=
left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border=
-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-t=
op-width:0px;color:rgb(0,0,0);display:inline;float:none;font-size:12.8px;fo=
nt-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;l=
ine-height:14.08px;margin-bottom:0px;margin-left:0px;margin-right:0px;margi=
n-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top=
:0px;text-align:left;text-decoration:none;text-indent:0px;text-transform:no=
ne;white-space:nowrap;word-spacing:0px"><font color=3D"#004000"></font><br =
style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bot=
tom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-le=
ft-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top=
-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></=
span></font></div><div><span style=3D"display:inline!important;float:none;b=
ackground-color:transparent;color:rgb(34,34,34);font-family:&quot;Arial&quo=
t;,&quot;Helvetica&quot;,sans-serif;font-size:13px;font-style:normal;font-v=
ariant:normal;font-weight:400;letter-spacing:normal;text-align:left;text-de=
coration:none;text-indent:0px;text-transform:none;white-space:normal;word-s=
pacing:0px">To use the interface </span><i>one must read the documentation<=
/i><span style=3D"display:inline!important;float:none;background-color:tran=
sparent;color:rgb(34,34,34);font-family:&quot;Arial&quot;,&quot;Helvetica&q=
uot;,sans-serif;font-size:13px;font-style:normal;font-variant:normal;font-w=
eight:400;letter-spacing:normal;text-align:left;text-decoration:none;text-i=
ndent:0px;text-transform:none;white-space:normal;word-spacing:0px">.=C2=A0<=
/span></div><div><b></b><i></i><u></u><sub></sub><sup></sup><strike></strik=
e><br></div><div><br></div></font></div><div><font face=3D"arial,sans-serif=
"><b>- Forth -</b></font></div><div><font face=3D"arial,sans-serif"><b><br>=
</b></font></div><div><font face=3D"arial,sans-serif">Because these are reg=
ular types, we must go through hoops to protect ageist name collisions both=
 for the type and the object.</font></div><div><font face=3D"arial,sans-ser=
if"><br></font></div><div>This is crucial if we want any form of natural na=
ming on the tags!</div><div><br></div><div>For example</div><div><br></div>=
<div><span style=3D"display:inline!important;float:none;background-color:tr=
ansparent;color:rgb(34,34,34);font-family:courier new,monospace;font-size:1=
3px;font-style:normal;font-variant:normal;font-weight:400;letter-spacing:no=
rmal;text-align:left;text-decoration:none;text-indent:0px;text-transform:no=
ne;white-space:normal;word-spacing:0px">class circle;</span></div><div><fon=
t face=3D"courier new,monospace">//...</font></div><div><font face=3D"couri=
er new,monospace">shape(labels::circle_t, . . .); //&lt; object is &#39;cir=
cle&#39;</font><br></div><div><b></b><i></i><u></u><sub></sub><sup></sup><s=
trike></strike><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike>=
<font face=3D"courier new,monospace"></font><br></div><div><font face=3D"ar=
ial,sans-serif"><font face=3D"&quot;Arial&quot;,&quot;Helvetica&quot;,sans-=
serif"></font>Here <font face=3D"courier new,monospace">circle</font> is go=
od first choice for <i>both</i> a label object name <i>and</i> a concrete t=
ype.</font><br></div><div><font face=3D"courier new,monospace"></font><font=
 face=3D"arial,sans-serif"></font><b></b><i></i><u></u><sub></sub><sup></su=
p><strike></strike><font face=3D"arial,sans-serif"></font><br></div><div>Ho=
wever, if we use <span style=3D"display:inline!important;float:none;backgro=
und-color:transparent;color:rgb(34,34,34);font-family:&quot;Arial&quot;,&qu=
ot;Helvetica&quot;,sans-serif;font-size:13px;font-style:normal;font-variant=
:normal;font-weight:400;letter-spacing:normal;text-align:left;text-decorati=
on:none;text-indent:0px;text-transform:none;white-space:normal;word-spacing=
:0px">qualified names</span>, we lose natural naming almost by definition.=
=C2=A0</div><div>It is a lose-lose situation - we go the extra mile to prot=
ect our names, and yet if there is a collision, we are not able to use them=
 naturally.</div><div><br></div><div><br></div><div><span style=3D"display:=
inline!important;float:none;background-color:transparent;color:rgb(34,34,34=
);font-family:arial,sans-serif;font-size:13px;font-style:normal;font-varian=
t:normal;font-weight:700;letter-spacing:normal;text-align:left;text-decorat=
ion:none;text-indent:0px;text-transform:none;white-space:normal;word-spacin=
g:0px">- Fifth -</span></div><div><b></b><i></i><u></u><sub></sub><sup></su=
p><strike></strike><br></div><div>Even with no collision we are forced to u=
se qualified names in many cases as the code would be <i>impossible</i> for=
 a human to parse correctly otherwise.</div><div><br></div><div><div><font =
face=3D"courier new,monospace" style=3D"border-bottom-color:rgb(34,34,34);b=
order-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34=
,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(34=
,34,34);border-right-style:none;border-right-width:0px;border-top-color:rgb=
(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;mar=
gin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-lef=
t:0px;padding-right:0px;padding-top:0px">rect(point pos, size sz);</font><b=
r></div></div><div><font face=3D"courier new,monospace">rect(labels::center=
_t, point val, size sz=3D{10,10});</font></div><div><font face=3D"courier n=
ew,monospace"><br></font></div><div><font face=3D"courier new,monospace">//=
 user</font><br></div><div><font face=3D"courier new,monospace"><br></font>=
</div><div><font face=3D"courier new,monospace"><span style=3D"display:inli=
ne!important;float:none;background-color:transparent;color:rgb(34,34,34);fo=
nt-family:courier new,monospace;font-size:13px;font-style:normal;font-varia=
nt:normal;font-weight:400;letter-spacing:normal;text-align:left;text-decora=
tion:none;text-indent:0px;text-transform:none;white-space:normal;word-spaci=
ng:0px">rect(center, {10,10}); <i>//&lt; which constructor is called? No wa=
y to tell without tracking &#39;center&#39; down=C2=A0</i></span></font></d=
iv><div><font face=3D"courier new,monospace"><span style=3D"display:inline!=
important;float:none;background-color:transparent;color:rgb(34,34,34);font-=
family:courier new,monospace;font-size:13px;font-style:normal;font-variant:=
normal;font-weight:400;letter-spacing:normal;text-align:left;text-decoratio=
n:none;text-indent:0px;text-transform:none;white-space:normal;word-spacing:=
0px"><i>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0=C2=A0 // to see if it is a tag object or the name of some variab=
le of type point</i></span></font></div><div><font face=3D"courier new,mono=
space"><i></i><br></font></div><div><font face=3D"arial,sans-serif">Of cour=
se, the alternative is to use &quot;smart naming&quot;.=C2=A0</font></div><=
div><br></div><div><font face=3D"arial,sans-serif">An example from std:</fo=
nt></div><div><font face=3D"arial,sans-serif"><br></font></div><div><font f=
ace=3D"courier new,monospace">std::allocator_arg</font><br></div><div><font=
 face=3D"arial,sans-serif"><b></b><i></i><u></u><sub></sub><sup></sup><stri=
ke></strike><br></font></div><div><font face=3D"arial,sans-serif">Hardly th=
e best option. We will return to this example again later.</font></div><div=
><font face=3D"arial,sans-serif"><br></font></div><div><font face=3D"arial,=
sans-serif"><br></font></div><div><font face=3D"courier new,monospace"><fon=
t face=3D"arial,sans-serif"></font><span style=3D"display:inline!important;=
float:none;background-color:transparent;color:rgb(34,34,34);font-family:ari=
al,sans-serif;font-size:13px;font-style:normal;font-variant:normal;font-wei=
ght:700;letter-spacing:normal;text-align:left;text-decoration:none;text-ind=
ent:0px;text-transform:none;white-space:normal;word-spacing:0px">- Sixth -<=
/span><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></fon=
t></div><div><font face=3D"courier new,monospace"><b></b><i></i><u></u><sub=
></sub><sup></sup><strike></strike><br></font></div><div><font face=3D"cour=
ier new,monospace">labels</font><font face=3D"arial,sans-serif"> is just a =
convention, and as with all conventions, it will be broken or not be presen=
t at all.</font></div><div><font face=3D"arial,sans-serif"><br></font></div=
><div><font face=3D"arial,sans-serif">If that&#39;s not bad enough, we </fo=
nt>still <font face=3D"arial,sans-serif">risk collision</font> this time wi=
th the scope name itself.</div><div><font face=3D"arial,sans-serif"></font>=
<br></div><div><font face=3D"arial,sans-serif"></font><br></div><div><font =
face=3D"arial,sans-serif">Now, before we dive into details, lets see some m=
ore examples</font></div><div><font face=3D"courier new,monospace"></font><=
font face=3D"arial,sans-serif"></font><br></div><div><font face=3D"courier =
new,monospace">case struct center;</font></div><div><span style=3D"text-ali=
gn:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spac=
ing:normal;font-size:13px;font-style:normal;font-variant:normal;font-weight=
:400;text-decoration:none;word-spacing:0px;display:inline!important;white-s=
pace:normal;float:none;background-color:transparent"><font face=3D"courier =
new,monospace">case struct bottomLeft;</font></span></div><div><font face=
=3D"courier new,monospace"></font><br></div><div><div><font face=3D"courier=
 new,monospace" style=3D"border-bottom-color:rgb(34,34,34);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bord=
er-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px">struct circle</font></div><div><font face=3D"cour=
ier new,monospace" style=3D"border-bottom-color:rgb(34,34,34);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-=
left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bord=
er-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);b=
order-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px">{</font></div><div><font face=3D"courier new,m=
onospace" style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:no=
ne;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-styl=
e:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top=
-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px">=C2=A0 <span style=3D"text-align:left;color:rgb(34,34,3=
4);text-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px=
;font-style:normal;font-variant:normal;font-weight:400;text-decoration:none=
;word-spacing:0px;display:inline!important;white-space:normal;float:none;ba=
ckground-color:transparent">circle</span>(point p, size sz);</font></div><d=
iv><font style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:non=
e;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style=
:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-s=
tyle:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-=
style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px"><span style=3D"margin:0px;padding:0px;border:0px rgb(34,=
34,34);text-align:left;color:rgb(34,34,34);text-transform:none;text-indent:=
0px;letter-spacing:normal;font-size:13px;font-style:normal;font-variant:nor=
mal;font-weight:400;text-decoration:none;word-spacing:0px;display:inline;wh=
ite-space:normal;float:none;background-color:transparent"><font face=3D"cou=
rier new,monospace">=C2=A0 <span style=3D"text-align:left;color:rgb(34,34,3=
4);text-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px=
;font-style:normal;font-variant:normal;font-weight:400;text-decoration:none=
;word-spacing:0px;display:inline!important;white-space:normal;float:none;ba=
ckground-color:transparent">circle</span>(case <span style=3D"margin:0px;pa=
dding:0px;border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34);text=
-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px;font-s=
tyle:normal;font-variant:normal;font-weight:400;text-decoration:none;word-s=
pacing:0px;display:inline;white-space:normal;float:none;background-color:tr=
ansparent">bottomLeft</span>, point p, size sz);</font></span><b style=3D"b=
ackground:none;margin:0px;padding:0px;border:0px rgb(34,34,34);height:auto;=
color:rgb(34,34,34);overflow:visible;font-size:13px;overflow-x:visible;over=
flow-y:visible;min-width:0px"></b><i style=3D"background:none;margin:0px;pa=
dding:0px;border:0px rgb(34,34,34);height:auto;color:rgb(34,34,34);overflow=
:visible;font-size:13px;overflow-x:visible;overflow-y:visible;min-width:0px=
"></i><u style=3D"background:none;margin:0px;padding:0px;border:0px rgb(34,=
34,34);height:auto;color:rgb(34,34,34);overflow:visible;font-size:13px;over=
flow-x:visible;overflow-y:visible;min-width:0px"></u><sub style=3D"border-b=
ottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></sub><=
sup style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none=
;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:=
none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style=
:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px"></sup><strike style=3D"border-bottom-color:rgb(34,34,34);bord=
er-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34=
);border-left-style:none;border-left-width:0px;border-right-color:rgb(34,34=
,34);border-right-style:none;border-right-width:0px;border-top-color:rgb(34=
,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin=
-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0=
px;padding-right:0px;padding-top:0px"></strike><br style=3D"background:none=
;margin:0px;padding:0px;border:0px rgb(34,34,34);height:auto;color:rgb(34,3=
4,34);overflow:visible;font-size:13px;overflow-x:visible;overflow-y:visible=
;min-width:0px"></font></div><div><font face=3D"courier new,monospace" styl=
e=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-=
left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bor=
der-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bo=
rder-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margi=
n-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top=
:0px">};</font></div><div><font style=3D"border-bottom-color:rgb(34,34,34);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,3=
4,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(3=
4,34,34);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px"><font face=3D"courier new,monospa=
ce"></font><br></font></div><div style=3D"margin:0px;padding:0px;border:0px=
 rgb(34,34,34);text-align:left;color:rgb(34,34,34);text-transform:none;text=
-indent:0px;letter-spacing:normal;font-size:13px;font-variant:normal;word-s=
pacing:0px;white-space:normal;background-color:transparent"><font style=3D"=
border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-wi=
dth:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-=
width:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-=
top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top=
:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"=
><span style=3D"text-align:left;color:rgb(34,34,34);text-transform:none;tex=
t-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal;font-va=
riant:normal;font-weight:400;text-decoration:none;word-spacing:0px;display:=
inline!important;white-space:normal;float:none;background-color:transparent=
"><font face=3D"courier new,monospace">case struct <span style=3D"text-alig=
n:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spaci=
ng:normal;font-size:13px;font-style:normal;font-variant:normal;font-weight:=
400;text-decoration:none;word-spacing:0px;display:inline!important;white-sp=
ace:normal;float:none;background-color:transparent">circle</span>;</font></=
span><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></font=
></div><div style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-a=
lign:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter-sp=
acing:normal;font-size:13px;font-variant:normal;word-spacing:0px;white-spac=
e:normal;background-color:transparent"><font style=3D"border-bottom-color:r=
gb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px"><span style=3D"margi=
n:0px;padding:0px;border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,=
34);text-transform:none;text-indent:0px;letter-spacing:normal;font-size:13p=
x;font-style:normal;font-variant:normal;font-weight:400;text-decoration:non=
e;word-spacing:0px;display:inline;white-space:normal;float:none;background-=
color:transparent"><font face=3D"courier new,monospace">case struct <span s=
tyle=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:left;col=
or:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:normal;=
font-size:13px;font-style:normal;font-variant:normal;font-weight:400;text-d=
ecoration:none;word-spacing:0px;display:inline;white-space:normal;float:non=
e;background-color:transparent">rect</span>;</font></span><b style=3D"margi=
n:0px;padding:0px;border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,=
34);text-transform:none;text-indent:0px;letter-spacing:normal;font-size:13p=
x;font-style:normal;font-variant:normal;font-weight:700;text-decoration:non=
e;word-spacing:0px;white-space:normal;background-color:transparent"></b><i =
style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:left;co=
lor:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:normal=
;font-size:13px;font-style:italic;font-variant:normal;font-weight:400;text-=
decoration:none;word-spacing:0px;white-space:normal;background-color:transp=
arent"></i><u style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text=
-align:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter-=
spacing:normal;font-size:13px;font-style:normal;font-variant:normal;font-we=
ight:400;text-decoration:underline;word-spacing:0px;white-space:normal;back=
ground-color:transparent"></u><sub style=3D"margin:0px;padding:0px;border:0=
px rgb(34,34,34);text-align:left;color:rgb(34,34,34);text-transform:none;te=
xt-indent:0px;letter-spacing:normal;font-size:9px;font-style:normal;font-va=
riant:normal;font-weight:400;text-decoration:none;word-spacing:0px;white-sp=
ace:normal;background-color:transparent"></sub><sup style=3D"margin:0px;pad=
ding:0px;border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34);text-=
transform:none;text-indent:0px;letter-spacing:normal;font-size:9px;font-sty=
le:normal;font-variant:normal;font-weight:400;text-decoration:none;word-spa=
cing:0px;white-space:normal;background-color:transparent"></sup><strike sty=
le=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:left;color=
:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:normal;fo=
nt-size:13px;font-style:normal;font-variant:normal;font-weight:400;text-dec=
oration:line-through;word-spacing:0px;white-space:normal;background-color:t=
ransparent"></strike><b></b><i></i><u></u><sub></sub><sup></sup><strike></s=
trike></font></div><div style=3D"margin:0px;padding:0px;border:0px rgb(34,3=
4,34);text-align:left;color:rgb(34,34,34);text-transform:none;text-indent:0=
px;letter-spacing:normal;font-size:13px;font-variant:normal;word-spacing:0p=
x;white-space:normal;background-color:transparent"><font style=3D"border-bo=
ttom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px=
;border-right-color:rgb(34,34,34);border-right-style:none;border-right-widt=
h:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width=
:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><font fa=
ce=3D"courier new,monospace"></font><br></font></div><div style=3D"margin:0=
px;padding:0px;border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34)=
;text-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px;f=
ont-variant:normal;word-spacing:0px;white-space:normal;background-color:tra=
nsparent"><font style=3D"border-bottom-color:rgb(34,34,34);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bord=
er-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px"><div><font face=3D"courier new,monospace" style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px">struct shape</font></div><div><font face=3D"courier new,monospace" sty=
le=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bot=
tom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;b=
order-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">{</font></div><div><font face=3D"courier new,monospace" style=3D"bor=
der-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width=
:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-wid=
th:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-righ=
t-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top=
-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">=
=C2=A0 template&lt;class... Args&gt;</font></div><div><font face=3D"courier=
 new,monospace" style=3D"border-bottom-color:rgb(34,34,34);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bord=
er-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px">=C2=A0 <span style=3D"text-align:left;color:rgb(3=
4,34,34);text-transform:none;text-indent:0px;letter-spacing:normal;font-siz=
e:13px;font-style:normal;font-variant:normal;font-weight:400;text-decoratio=
n:none;word-spacing:0px;display:inline!important;white-space:normal;float:n=
one;background-color:transparent">shape</span>(case circle, Args&amp;&amp;.=
...); <i>//&lt; &quot;in-place&quot; construct a circle as shape</i></font><=
font style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bo=
rder-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:non=
e;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style=
:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-styl=
e:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px"><br></font></div><div><font face=3D"courier new,monospace" s=
tyle=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;bord=
er-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;=
border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none=
;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;ma=
rgin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-=
top:0px">=C2=A0 <span style=3D"text-align:left;color:rgb(34,34,34);text-tra=
nsform:none;text-indent:0px;letter-spacing:normal;font-size:13px;font-style=
:normal;font-variant:normal;font-weight:400;text-decoration:none;word-spaci=
ng:0px;display:inline!important;white-space:normal;float:none;background-co=
lor:transparent">shape</span>(<span style=3D"text-align:left;color:rgb(34,3=
4,34);text-transform:none;text-indent:0px;letter-spacing:normal;font-size:1=
3px;font-style:normal;font-variant:normal;font-weight:400;text-decoration:n=
one;word-spacing:0px;display:inline!important;white-space:normal;float:none=
;background-color:transparent">circle</span>, color);=C2=A0 <i>//&lt; </i><=
span style=3D"display:inline!important;float:none;background-color:transpar=
ent;color:rgb(34,34,34);font-family:courier new,monospace;font-size:13px;fo=
nt-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;t=
ext-align:left;text-decoration:none;text-indent:0px;text-transform:none;whi=
te-space:normal;word-spacing:0px">from object of type circle</span></font><=
/div><div><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br><=
/div><div><font style=3D"border-bottom-color:rgb(34,34,34);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bord=
er-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px"><font face=3D"courier new,monospace" style=3D"bor=
der-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width=
:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-wid=
th:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-righ=
t-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top=
-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">=
=C2=A0 template&lt;class... Args&gt;</font></font></div><div><font style=3D=
"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left=
-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-=
right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border=
-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
"><div style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:=
left;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing=
:normal;font-size:13px;font-style:normal;font-variant:normal;font-weight:40=
0;text-decoration:none;word-spacing:0px;white-space:normal;background-color=
:transparent"><font face=3D"courier new,monospace" style=3D"border-bottom-c=
olor:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px">=C2=A0 <span s=
tyle=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:left;col=
or:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:normal;=
font-size:13px;font-style:normal;font-variant:normal;font-weight:400;text-d=
ecoration:none;word-spacing:0px;display:inline;white-space:normal;float:non=
e;background-color:transparent">shape</span>(case rect, Args&amp;&amp;...);=
 <i>//&lt; </i><i>&quot;in-place&quot; </i><font></font><i>overload for rec=
t</i></font><font style=3D"border-bottom-color:rgb(34,34,34);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-l=
eft-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bo=
rder-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;=
margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding=
-right:0px;padding-top:0px"></font></div></font></div><div><font face=3D"co=
urier new,monospace" style=3D"border-bottom-color:rgb(34,34,34);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);borde=
r-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34)=
;border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0=
px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padd=
ing-right:0px;padding-top:0px">};</font></div><div><b></b><i></i><u></u><su=
b></sub><sup></sup><strike></strike><font face=3D"courier new,monospace"></=
font><br></div><div><font face=3D"courier new,monospace">// usage highlight=
s</font></div><div><font face=3D"courier new,monospace"></font><br></div><d=
iv><span style=3D"display:inline!important;float:none;background-color:tran=
sparent;color:rgb(34,34,34);font-family:courier new,monospace;font-size:13p=
x;font-style:normal;font-variant:normal;font-weight:400;letter-spacing:norm=
al;text-align:left;text-decoration:none;text-indent:0px;text-transform:none=
;white-space:normal;word-spacing:0px">const auto circle =3D mycircle();</sp=
an><br></div></font></div><b></b><i></i><u></u><sub></sub><sup></sup><strik=
e></strike><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><fon=
t face=3D"courier new,monospace">shape(circle, red); //&lt; as usual, from =
object of type circle</font><br></div><div><br></div><div><span style=3D"te=
xt-align:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;lette=
r-spacing:normal;font-size:13px;font-style:normal;font-variant:normal;font-=
weight:400;text-decoration:none;word-spacing:0px;display:inline!important;w=
hite-space:normal;float:none;background-color:transparent"><font face=3D"co=
urier new,monospace">shape(circle: <span style=3D"margin:0px;padding:0px;bo=
rder:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34);text-transform:n=
one;text-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal;=
font-variant:normal;font-weight:400;text-decoration:none;word-spacing:0px;d=
isplay:inline;white-space:normal;float:none;background-color:transparent">b=
ottomLeft: </span>p, sz); <i>//&lt; calling implicit &quot;named constructo=
r&quot; for circle - impossible with static functions!</i></font></span></d=
iv><div><span style=3D"text-align:left;color:rgb(34,34,34);text-transform:n=
one;text-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal;=
font-variant:normal;font-weight:400;text-decoration:none;word-spacing:0px;d=
isplay:inline!important;white-space:normal;float:none;background-color:tran=
sparent"><font face=3D"courier new,monospace"><i></i><br></font></span></di=
v><div><span style=3D"text-align:left;color:rgb(34,34,34);text-transform:no=
ne;text-indent:0px;letter-spacing:normal;font-size:13px;font-variant:normal=
;word-spacing:0px;display:inline!important;white-space:normal;float:none;ba=
ckground-color:transparent"><font face=3D"courier new,monospace"><span styl=
e=3D"display:inline!important;float:none;background-color:transparent;color=
:rgb(34,34,34);font-family:courier new,monospace;font-size:13px;font-style:=
normal;font-variant:normal;font-weight:400;letter-spacing:normal;text-align=
:left;text-decoration:none;text-indent:0px;text-transform:none;white-space:=
normal;word-spacing:0px">auto sh =3D std::make_shared&lt;shape&gt;(circle: =
p, sz</span><span style=3D"display:inline!important;float:none;background-c=
olor:transparent;color:rgb(34,34,34);font-family:courier new,monospace;font=
-size:13px;font-style:normal;font-variant:normal;font-weight:400;letter-spa=
cing:normal;text-align:left;text-decoration:none;text-indent:0px;text-trans=
form:none;white-space:normal;word-spacing:0px">); <i>//&lt; yep, it works -=
 the label is not part of the name of the function!</i></span><br></font></=
span></div><div><br></div><div><font face=3D"arial,sans-serif">Also note, w=
e can build any shape using SFINAE.</font></div><div><font face=3D"arial,sa=
ns-serif"><br></font></div><div><font face=3D"arial,sans-serif"><br></font>=
</div><div><font face=3D"arial,sans-serif">The usefulness of this idiom is =
by no means limited to constructors.</font></div><div><font face=3D"arial,s=
ans-serif"><br></font></div><div><font face=3D"arial,sans-serif">We can ima=
gine</font></div><div><font face=3D"arial,sans-serif"><br></font></div><div=
><span style=3D"text-align:left;color:rgb(34,34,34);text-transform:none;tex=
t-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal;font-va=
riant:normal;font-weight:400;text-decoration:none;word-spacing:0px;display:=
inline!important;white-space:normal;float:none;background-color:transparent=
"><font face=3D"courier new,monospace">write(Data);</font></span><b></b><i>=
</i><u></u><sub></sub><sup></sup><strike></strike><br></div><div><font face=
=3D"courier new,monospace">write(case noCommit, Data);</font></div><div><fo=
nt face=3D"courier new,monospace"><br></font></div><div><font face=3D"arial=
,sans-serif">This is more then valuable alternative to any of the current m=
ethods - a bool argument, an enum argument or a different function name.=C2=
=A0</font></div><div><font face=3D"arial,sans-serif">For a real word exampl=
e one should look no further then parallel stl.</font><br></div><div><font =
face=3D"courier new,monospace"></font><br></div><div>Lets return to constru=
ctors</div><div><div><span style=3D"background-color:transparent;border-bot=
tom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bo=
rder-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;=
border-right-color:rgb(34,34,34);border-right-style:none;border-right-width=
:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:=
0px;color:rgb(34,34,34);display:inline;float:none;font-family:arial,sans-se=
rif;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;le=
tter-spacing:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px;text-align:left;text-decoration:none;text-indent:0px;text-transform:n=
one;white-space:normal;word-spacing:0px"><br style=3D"border-bottom-color:r=
gb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px"></span></div><div><s=
pan style=3D"background-color:transparent;border-bottom-color:rgb(34,34,34)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,=
34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
34,34,34);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34)=
;display:inline;float:none;font-family:arial,sans-serif;font-size:13px;font=
-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-align:left;t=
ext-decoration:none;text-indent:0px;text-transform:none;white-space:normal;=
word-spacing:0px"><span style=3D"background-color:transparent;border-bottom=
-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;bor=
der-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0p=
x;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px=
;color:rgb(34,34,34);display:inline;float:none;font-family:arial,sans-serif=
;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;lette=
r-spacing:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px;text-align:left;text-decoration:none;text-indent:0px;text-transform:none=
;white-space:normal;word-spacing:0px">Label arguments are transparent to th=
e type system once bound to a typename.</span></span><span style=3D"backgro=
und-color:transparent;border-bottom-color:rgb(34,34,34);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-s=
tyle:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-rig=
ht-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-=
top-style:none;border-top-width:0px;color:rgb(34,34,34);display:inline;floa=
t:none;font-family:arial,sans-serif;font-size:13px;font-style:normal;font-v=
ariant:normal;font-weight:400;letter-spacing:normal;margin-bottom:0px;margi=
n-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:=
0px;padding-right:0px;padding-top:0px;text-align:left;text-decoration:none;=
text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><b=
r style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;borde=
r-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;b=
order-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:no=
ne;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:n=
one;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px"></span></div></div><div><div><span style=3D"background-color:tr=
ansparent;border-bottom-color:rgb(34,34,34);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:no=
ne;border-top-width:0px;color:rgb(34,34,34);display:inline;float:none;font-=
family:arial,sans-serif;font-size:13px;font-style:normal;font-variant:norma=
l;font-weight:400;letter-spacing:normal;margin-bottom:0px;margin-left:0px;m=
argin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-=
right:0px;padding-top:0px;text-align:left;text-decoration:none;text-indent:=
0px;text-transform:none;white-space:normal;word-spacing:0px">As a result te=
mplate argument deduction just works, again, something <i>impossible</i> wi=
th static functions.=C2=A0</span><b></b></div></div></div></blockquote></di=
v>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CALvx3hbzZG%3DK1z49Zozygq_%2BwU6aXpG2=
8w%3D1EVm43LX%3Duces%2BQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Df=
ooter">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3h=
bzZG%3DK1z49Zozygq_%2BwU6aXpG28w%3D1EVm43LX%3Duces%2BQ%40mail.gmail.com</a>=
..<br />

--0000000000006ec3fd0571565f31--

.


Author: mihailnajdenov@gmail.com
Date: Thu, 19 Jul 2018 08:58:31 -0700 (PDT)
Raw View
------=_Part_3800_1191466350.1532015911494
Content-Type: multipart/alternative;
 boundary="----=_Part_3801_951450425.1532015911494"

------=_Part_3801_951450425.1532015911494
Content-Type: text/plain; charset="UTF-8"



On Thursday, July 19, 2018 at 11:57:48 AM UTC+3, Richard Hodges wrote:
>
> Sorry for the top post. Perhaps the group could let me know if this is
> worthy of a separate thread.
>
> I actually have a use case in which areas of this proposal would be useful.
>
> I am writing a library which wraps c-style libraries into c++ value-type
> objects.
>
> I have a class which acts as an indication that a raw pointer is being
> adopted:
>
> namespace wrapper { namespace core {
>
>     template<class T>
>     struct adopted_pointer
>     {
>         adopted_pointer(T *p) noexcept
>             : ptr_(p)
>         {
>         }
>
>         adopted_pointer(adopted_pointer const& other) = delete;
>
>         constexpr adopted_pointer(adopted_pointer&& other) noexcept
>             : ptr_(other.ptr_)
>         {
>             other.ptr_ = nullptr;
>         }
>
>         adopted_pointer& operator =(adopted_pointer&& other) = delete;
>
>         adopted_pointer& operator =(adopted_pointer const&& other) = delete;
>
>         ~adopted_pointer() noexcept
>         {
>             assert(!ptr_);
>         }
>
>         T *get()&&
>         {
>             auto result = ptr_;
>             ptr_ = nullptr;
>             return result;
>         }
>
>         T *ptr_;
>     };
>
>
> There is further function in the wrapper namespace to create such an
> adoption indicator:
>
> namespace wrapper {
>
>     using ::wrapper::core::adopted_pointer;
>
>     template<class T>
>     auto adopt(T *p) -> adopted_pointer<T>
>     {
>         return {p};
>     }
>
> }
>
>
> I can now specify explicitly in a constructor that a pointer created in
> another library is being adopted (i.e. we are controlling ownership):
>
> auto ps = reinterpret_cast<char*>(std::malloc(100));
> std::strcpy(ps, "hello, world");
> auto ds = wrapper::core::dynamic_c_string(wrapper::adopt(ps));
>
>
> The above code is in the global namespace, hence the need to fully qualify
> the call to adopt.
>
> What might be nice is to be able to specify:
>
> auto ds = wrapper::core::dynamic_c_string(adopt: ps);
>
>
> Which in effect means 'search for the name 'adopt' in the callee's
> namespace rather than the caller's.
>
> I think there is a reasonable argument for exploring this use case.
>
>
Great example! Also, the presence of adopt() is not evident without
documentation, where using a label the interface is self-explanatory.

BTW the Intrusive Smart Pointer
<http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0468r0.html>
proposal is in similar situation - they need to either construct *or*
construct-and-retain.
The initial code from 15+ years ago used a bool, they now use a tag.

explicit retain_ptr(pointer) noexcept;
retain_ptr(pointer, retain_t) noexcept(/* see below */);


Needless to say, on the call site a label argument will look better, if not
great object(retain: obj)

--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/595e91db-22d8-4b47-bf56-91798f960a5f%40isocpp.org.

------=_Part_3801_951450425.1532015911494
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Thursday, July 19, 2018 at 11:57:48 AM UTC+3, R=
ichard Hodges wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;ma=
rgin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=
=3D"ltr">Sorry for the top post. Perhaps the group could let me know if thi=
s is worthy of a separate thread.<div><br></div><div>I actually have a use =
case in which areas of this proposal would be useful.</div><div><br></div><=
div>I am writing a library which wraps c-style libraries into c++ value-typ=
e objects.</div><div><br></div><div>I have a class which acts as an indicat=
ion that a raw pointer is being adopted:</div><div><br></div><div><pre styl=
e=3D"background-color:rgb(43,43,43);color:rgb(169,183,198);font-family:Menl=
o;font-size:9pt"><span style=3D"color:rgb(204,120,50);font-weight:bold">nam=
espace </span>wrapper { <span style=3D"color:rgb(204,120,50);font-weight:bo=
ld">namespace </span>core {<br><br>    <span style=3D"color:rgb(204,120,50)=
;font-weight:bold">template</span>&lt;<span style=3D"color:rgb(204,120,50);=
font-weight:bold">class </span>T&gt;<br>    <span style=3D"color:rgb(204,12=
0,50);font-weight:bold">struct </span>adopted_pointer<br>    {<br>        a=
dopted_pointer(T *p) <span style=3D"color:rgb(204,120,50);font-weight:bold"=
>noexcept<br></span><span style=3D"color:rgb(204,120,50);font-weight:bold">=
            </span>: ptr_(p)<br>        {<br>        }<br><br>        adopt=
ed_pointer(adopted_<wbr>pointer <span style=3D"color:rgb(204,120,50);font-w=
eight:bold">const</span>&amp; other) =3D <span style=3D"color:rgb(204,120,5=
0);font-weight:bold">delete</span><span style=3D"color:rgb(204,120,50)">;<b=
r></span><span style=3D"color:rgb(204,120,50)"><br></span><span style=3D"co=
lor:rgb(204,120,50)">        </span><span style=3D"color:rgb(204,120,50);fo=
nt-weight:bold">constexpr </span>adopted_pointer(adopted_<wbr>pointer&amp;&=
amp; other) <span style=3D"color:rgb(204,120,50);font-weight:bold">noexcept=
<br></span><span style=3D"color:rgb(204,120,50);font-weight:bold">         =
   </span>: ptr_(other.ptr_)<br>        {<br>            other.ptr_ =3D <sp=
an style=3D"color:rgb(204,120,50);font-weight:bold">nullptr</span><span sty=
le=3D"color:rgb(204,120,50)">;<br></span><span style=3D"color:rgb(204,120,5=
0)">        </span>}<br><br>        adopted_pointer&amp; <span style=3D"col=
or:rgb(204,120,50);font-weight:bold">operator </span>=3D(adopted_pointer&am=
p;&amp; other) =3D <span style=3D"color:rgb(204,120,50);font-weight:bold">d=
elete</span><span style=3D"color:rgb(204,120,50)">;<br></span><span style=
=3D"color:rgb(204,120,50)"><br></span><span style=3D"color:rgb(204,120,50)"=
>        </span>adopted_pointer&amp; <span style=3D"color:rgb(204,120,50);f=
ont-weight:bold">operator </span>=3D(adopted_pointer <span style=3D"color:r=
gb(204,120,50);font-weight:bold">const</span>&amp;&amp; other) =3D <span st=
yle=3D"color:rgb(204,120,50);font-weight:bold">delete</span><span style=3D"=
color:rgb(204,120,50)">;<br></span><span style=3D"color:rgb(204,120,50)"><b=
r></span><span style=3D"color:rgb(204,120,50)">        </span>~adopted_poin=
ter() <span style=3D"color:rgb(204,120,50);font-weight:bold">noexcept<br></=
span><span style=3D"color:rgb(204,120,50);font-weight:bold">        </span>=
{<br>            assert(!ptr_)<span style=3D"color:rgb(204,120,50)">;<br></=
span><span style=3D"color:rgb(204,120,50)">        </span>}<br><br>        =
T *get()&amp;&amp;<br>        {<br>            <span style=3D"color:rgb(204=
,120,50);font-weight:bold">auto </span>result =3D ptr_<span style=3D"color:=
rgb(204,120,50)">;<br></span><span style=3D"color:rgb(204,120,50)">        =
    </span>ptr_ =3D <span style=3D"color:rgb(204,120,50);font-weight:bold">=
nullptr</span><span style=3D"color:rgb(204,120,50)">;<br></span><span style=
=3D"color:rgb(204,120,50)">            </span><span style=3D"color:rgb(204,=
120,50);font-weight:bold">return </span>result<span style=3D"color:rgb(204,=
120,50)">;<br></span><span style=3D"color:rgb(204,120,50)">        </span>}=
<br><br>        T *ptr_<span style=3D"color:rgb(204,120,50)">;<br></span><s=
pan style=3D"color:rgb(204,120,50)">    </span>}<span style=3D"color:rgb(20=
4,120,50)">;<br></span></pre><br></div><div>There is further function in th=
e wrapper namespace to create such an adoption indicator:</div><div><br></d=
iv><div><pre style=3D"background-color:rgb(43,43,43);color:rgb(169,183,198)=
;font-family:Menlo;font-size:9pt"><span style=3D"color:rgb(204,120,50);font=
-weight:bold">namespace </span>wrapper {<br><br>    <span style=3D"color:rg=
b(204,120,50);font-weight:bold">using </span>::wrapper::core::adopted_<wbr>=
pointer<span style=3D"color:rgb(204,120,50)">;<br></span><span style=3D"col=
or:rgb(204,120,50)"><br></span><span style=3D"color:rgb(204,120,50)">    </=
span><span style=3D"color:rgb(204,120,50);font-weight:bold">template</span>=
&lt;<span style=3D"color:rgb(204,120,50);font-weight:bold">class </span>T&g=
t;<br>    <span style=3D"color:rgb(204,120,50);font-weight:bold">auto </spa=
n>adopt(T *p) -&gt; adopted_pointer&lt;T&gt;<br>    {<br>        <span styl=
e=3D"color:rgb(204,120,50);font-weight:bold">return </span>{p}<span style=
=3D"color:rgb(204,120,50)">;<br></span><span style=3D"color:rgb(204,120,50)=
">    </span>}<br><br>}</pre><br></div><div>I can now specify explicitly in=
 a constructor that a pointer created in another library is being adopted (=
i.e. we are controlling ownership):<br><br><pre style=3D"background-color:r=
gb(43,43,43);color:rgb(169,183,198);font-family:Menlo;font-size:9pt"><span =
style=3D"color:rgb(204,120,50);font-weight:bold">auto </span>ps =3D <span s=
tyle=3D"color:rgb(204,120,50);font-weight:bold">reinterpret_cast</span>&lt;=
<span style=3D"color:rgb(204,120,50);font-weight:bold">char</span>*&gt;(std=
::<wbr>malloc(<span style=3D"color:rgb(104,151,187)">100</span>))<span styl=
e=3D"color:rgb(204,120,50)">;<br></span>std::strcpy(ps<span style=3D"color:=
rgb(204,120,50)">, </span><span style=3D"color:rgb(106,135,89)">&quot;hello=
, world&quot;</span>)<span style=3D"color:rgb(204,120,50)">;<br></span><spa=
n style=3D"color:rgb(204,120,50);font-weight:bold">auto </span>ds =3D wrapp=
er::core::dynamic_c_<wbr>string(wrapper::adopt(ps))<span style=3D"color:rgb=
(204,120,50)">;<br></span></pre><br></div><div>The above code is in the glo=
bal namespace, hence the need to fully qualify the call to adopt.</div><div=
><br></div><div>What might be nice is to be able to specify:<br><br><pre st=
yle=3D"background-color:rgb(43,43,43);color:rgb(169,183,198);font-family:Me=
nlo;font-size:9pt"><span style=3D"color:rgb(204,120,50);font-weight:bold">a=
uto </span>ds =3D wrapper::core::dynamic_c_<wbr>string(adopt: ps)<span styl=
e=3D"color:rgb(204,120,50)">;<br></span></pre><br></div><div>Which in effec=
t means &#39;search for the name &#39;adopt&#39; in the callee&#39;s namesp=
ace rather than the caller&#39;s.</div><div><br></div><div>I think there is=
 a reasonable argument for exploring this use case.=C2=A0</div><div><br></d=
iv></div></blockquote><div><br></div><div>Great example! Also, the presence=
 of adopt() is not evident without documentation, where using a label the i=
nterface is self-explanatory.=C2=A0</div><div><b></b><i></i><u></u><sub></s=
ub><sup></sup><strike></strike><br></div><div>BTW the<a href=3D"http://www.=
open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0468r0.html"> Intrusive Smart=
 Pointer</a> proposal is in similar situation - they need to either constru=
ct <i>or</i> construct-and-retain.=C2=A0</div><div>The initial code from 15=
+ years ago used a bool, they now use a tag.</div><div><br></div><div><span=
 style=3D"display: inline !important; float: none; background-color: transp=
arent; color: rgb(34, 34, 34); font-family: courier new,monospace; font-siz=
e: 13px; font-style: normal; font-variant: normal; font-weight: 400; letter=
-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text=
-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-s=
pace: normal; word-spacing: 0px;">explicit retain_ptr(pointer) noexcept;</s=
pan><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></div><=
font face=3D"courier new,monospace">retain_ptr(pointer, retain_t) noexcept(=
/* see below */);<br></font><div><font face=3D"courier new,monospace"></fon=
t><br></div><div><font face=3D"courier new,monospace"><br></font></div><div=
><font face=3D"arial,sans-serif">Needless to say, on the call site a label =
argument will look better, if not great</font><font face=3D"courier new,mon=
ospace"> object(retain: obj)</font></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/595e91db-22d8-4b47-bf56-91798f960a5f%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/595e91db-22d8-4b47-bf56-91798f960a5f=
%40isocpp.org</a>.<br />

------=_Part_3801_951450425.1532015911494--

------=_Part_3800_1191466350.1532015911494--

.


Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 19 Jul 2018 09:00:51 -0700 (PDT)
Raw View
------=_Part_3688_1075519921.1532016051608
Content-Type: multipart/alternative;
 boundary="----=_Part_3689_1198163692.1532016051609"

------=_Part_3689_1198163692.1532016051609
Content-Type: text/plain; charset="UTF-8"



On Thursday, July 19, 2018 at 4:57:48 AM UTC-4, Richard Hodges wrote:
>
> Sorry for the top post. Perhaps the group could let me know if this is
> worthy of a separate thread.
>
> I actually have a use case in which areas of this proposal would be useful.
>
> I am writing a library which wraps c-style libraries into c++ value-type
> objects.
>
> I have a class which acts as an indication that a raw pointer is being
> adopted:
>
> namespace wrapper { namespace core {
>
>     template<class T>
>     struct adopted_pointer
>     {
>         adopted_pointer(T *p) noexcept
>             : ptr_(p)
>         {
>         }
>
>         adopted_pointer(adopted_pointer const& other) = delete;
>
>         constexpr adopted_pointer(adopted_pointer&& other) noexcept
>             : ptr_(other.ptr_)
>         {
>             other.ptr_ = nullptr;
>         }
>
>         adopted_pointer& operator =(adopted_pointer&& other) = delete;
>
>         adopted_pointer& operator =(adopted_pointer const&& other) = delete;
>
>         ~adopted_pointer() noexcept
>         {
>             assert(!ptr_);
>         }
>
>         T *get()&&
>         {
>             auto result = ptr_;
>             ptr_ = nullptr;
>             return result;
>         }
>
>         T *ptr_;
>     };
>
>
> There is further function in the wrapper namespace to create such an
> adoption indicator:
>
> namespace wrapper {
>
>     using ::wrapper::core::adopted_pointer;
>
>     template<class T>
>     auto adopt(T *p) -> adopted_pointer<T>
>     {
>         return {p};
>     }
>
> }
>
>
> I can now specify explicitly in a constructor that a pointer created in
> another library is being adopted (i.e. we are controlling ownership):
>
> auto ps = reinterpret_cast<char*>(std::malloc(100));
> std::strcpy(ps, "hello, world");
> auto ds = wrapper::core::dynamic_c_string(wrapper::adopt(ps));
>
>
> The above code is in the global namespace, hence the need to fully qualify
> the call to adopt.
>
> What might be nice is to be able to specify:
>
> auto ds = wrapper::core::dynamic_c_string(adopt: ps);
>
>
> Which in effect means 'search for the name 'adopt' in the callee's
> namespace rather than the caller's.
>
> I think there is a reasonable argument for exploring this use case.
>

I mentioned something to this effect on another thread. It was essentially
the ability to deduce the full "pathname" of an identifier from the
location where that identifier gets used. Such syntax would be useful in a
number of places.

Switching over an `enum class` is a place where people often find it
annoying to have to re-type `EnumName::` before the enumerators, even
though the compiler knows statically where the enumerator comes from. Now
obviously you can't use `identifier:` for that syntax, since `case`
statements are terminated by `:` characters. But the principle is
meaningful.

The problem of course is that this is somewhat orthogonal to what this
proposal is trying to achieve. That is, this proposal does do full
"pathname" search of these types, but only as a consequence of its far more
specific goal. As I said in the other thread, it's like Gor-coroutines vs.
Core-coroutines: policy vs. mechanisms. Policies can only be used for one
thing, while mechanisms can be used for a plethora of things.

Basically, with "pathname" identifier lookup syntax, you get get the effect
of this proposal, except that you need to do `{},` after such tags. The OP
seems to think that this is not good enough, that we really need to
disguise the fact that an argument is an argument, so the more general
mechanis is unlikely to be pursued by them.

>

--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/8ffa3adb-29ab-49bb-8a84-56bea1fafc74%40isocpp.org.

------=_Part_3689_1198163692.1532016051609
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Thursday, July 19, 2018 at 4:57:48 AM UTC-4, Ri=
chard Hodges wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;mar=
gin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D=
"ltr">Sorry for the top post. Perhaps the group could let me know if this i=
s worthy of a separate thread.<div><br></div><div>I actually have a use cas=
e in which areas of this proposal would be useful.</div><div><br></div><div=
>I am writing a library which wraps c-style libraries into c++ value-type o=
bjects.</div><div><br></div><div>I have a class which acts as an indication=
 that a raw pointer is being adopted:</div><div><br></div><div><pre style=
=3D"background-color:rgb(43,43,43);color:rgb(169,183,198);font-family:Menlo=
;font-size:9pt"><span style=3D"color:rgb(204,120,50);font-weight:bold">name=
space </span>wrapper { <span style=3D"color:rgb(204,120,50);font-weight:bol=
d">namespace </span>core {<br><br>    <span style=3D"color:rgb(204,120,50);=
font-weight:bold">template</span>&lt;<span style=3D"color:rgb(204,120,50);f=
ont-weight:bold">class </span>T&gt;<br>    <span style=3D"color:rgb(204,120=
,50);font-weight:bold">struct </span>adopted_pointer<br>    {<br>        ad=
opted_pointer(T *p) <span style=3D"color:rgb(204,120,50);font-weight:bold">=
noexcept<br></span><span style=3D"color:rgb(204,120,50);font-weight:bold"> =
           </span>: ptr_(p)<br>        {<br>        }<br><br>        adopte=
d_pointer(adopted_<wbr>pointer <span style=3D"color:rgb(204,120,50);font-we=
ight:bold">const</span>&amp; other) =3D <span style=3D"color:rgb(204,120,50=
);font-weight:bold">delete</span><span style=3D"color:rgb(204,120,50)">;<br=
></span><span style=3D"color:rgb(204,120,50)"><br></span><span style=3D"col=
or:rgb(204,120,50)">        </span><span style=3D"color:rgb(204,120,50);fon=
t-weight:bold">constexpr </span>adopted_pointer(adopted_<wbr>pointer&amp;&a=
mp; other) <span style=3D"color:rgb(204,120,50);font-weight:bold">noexcept<=
br></span><span style=3D"color:rgb(204,120,50);font-weight:bold">          =
  </span>: ptr_(other.ptr_)<br>        {<br>            other.ptr_ =3D <spa=
n style=3D"color:rgb(204,120,50);font-weight:bold">nullptr</span><span styl=
e=3D"color:rgb(204,120,50)">;<br></span><span style=3D"color:rgb(204,120,50=
)">        </span>}<br><br>        adopted_pointer&amp; <span style=3D"colo=
r:rgb(204,120,50);font-weight:bold">operator </span>=3D(adopted_pointer&amp=
;&amp; other) =3D <span style=3D"color:rgb(204,120,50);font-weight:bold">de=
lete</span><span style=3D"color:rgb(204,120,50)">;<br></span><span style=3D=
"color:rgb(204,120,50)"><br></span><span style=3D"color:rgb(204,120,50)">  =
      </span>adopted_pointer&amp; <span style=3D"color:rgb(204,120,50);font=
-weight:bold">operator </span>=3D(adopted_pointer <span style=3D"color:rgb(=
204,120,50);font-weight:bold">const</span>&amp;&amp; other) =3D <span style=
=3D"color:rgb(204,120,50);font-weight:bold">delete</span><span style=3D"col=
or:rgb(204,120,50)">;<br></span><span style=3D"color:rgb(204,120,50)"><br><=
/span><span style=3D"color:rgb(204,120,50)">        </span>~adopted_pointer=
() <span style=3D"color:rgb(204,120,50);font-weight:bold">noexcept<br></spa=
n><span style=3D"color:rgb(204,120,50);font-weight:bold">        </span>{<b=
r>            assert(!ptr_)<span style=3D"color:rgb(204,120,50)">;<br></spa=
n><span style=3D"color:rgb(204,120,50)">        </span>}<br><br>        T *=
get()&amp;&amp;<br>        {<br>            <span style=3D"color:rgb(204,12=
0,50);font-weight:bold">auto </span>result =3D ptr_<span style=3D"color:rgb=
(204,120,50)">;<br></span><span style=3D"color:rgb(204,120,50)">           =
 </span>ptr_ =3D <span style=3D"color:rgb(204,120,50);font-weight:bold">nul=
lptr</span><span style=3D"color:rgb(204,120,50)">;<br></span><span style=3D=
"color:rgb(204,120,50)">            </span><span style=3D"color:rgb(204,120=
,50);font-weight:bold">return </span>result<span style=3D"color:rgb(204,120=
,50)">;<br></span><span style=3D"color:rgb(204,120,50)">        </span>}<br=
><br>        T *ptr_<span style=3D"color:rgb(204,120,50)">;<br></span><span=
 style=3D"color:rgb(204,120,50)">    </span>}<span style=3D"color:rgb(204,1=
20,50)">;<br></span></pre><br></div><div>There is further function in the w=
rapper namespace to create such an adoption indicator:</div><div><br></div>=
<div><pre style=3D"background-color:rgb(43,43,43);color:rgb(169,183,198);fo=
nt-family:Menlo;font-size:9pt"><span style=3D"color:rgb(204,120,50);font-we=
ight:bold">namespace </span>wrapper {<br><br>    <span style=3D"color:rgb(2=
04,120,50);font-weight:bold">using </span>::wrapper::core::adopted_<wbr>poi=
nter<span style=3D"color:rgb(204,120,50)">;<br></span><span style=3D"color:=
rgb(204,120,50)"><br></span><span style=3D"color:rgb(204,120,50)">    </spa=
n><span style=3D"color:rgb(204,120,50);font-weight:bold">template</span>&lt=
;<span style=3D"color:rgb(204,120,50);font-weight:bold">class </span>T&gt;<=
br>    <span style=3D"color:rgb(204,120,50);font-weight:bold">auto </span>a=
dopt(T *p) -&gt; adopted_pointer&lt;T&gt;<br>    {<br>        <span style=
=3D"color:rgb(204,120,50);font-weight:bold">return </span>{p}<span style=3D=
"color:rgb(204,120,50)">;<br></span><span style=3D"color:rgb(204,120,50)"> =
   </span>}<br><br>}</pre><br></div><div>I can now specify explicitly in a =
constructor that a pointer created in another library is being adopted (i.e=
.. we are controlling ownership):<br><br><pre style=3D"background-color:rgb(=
43,43,43);color:rgb(169,183,198);font-family:Menlo;font-size:9pt"><span sty=
le=3D"color:rgb(204,120,50);font-weight:bold">auto </span>ps =3D <span styl=
e=3D"color:rgb(204,120,50);font-weight:bold">reinterpret_cast</span>&lt;<sp=
an style=3D"color:rgb(204,120,50);font-weight:bold">char</span>*&gt;(std::<=
wbr>malloc(<span style=3D"color:rgb(104,151,187)">100</span>))<span style=
=3D"color:rgb(204,120,50)">;<br></span>std::strcpy(ps<span style=3D"color:r=
gb(204,120,50)">, </span><span style=3D"color:rgb(106,135,89)">&quot;hello,=
 world&quot;</span>)<span style=3D"color:rgb(204,120,50)">;<br></span><span=
 style=3D"color:rgb(204,120,50);font-weight:bold">auto </span>ds =3D wrappe=
r::core::dynamic_c_<wbr>string(wrapper::adopt(ps))<span style=3D"color:rgb(=
204,120,50)">;<br></span></pre><br></div><div>The above code is in the glob=
al namespace, hence the need to fully qualify the call to adopt.</div><div>=
<br></div><div>What might be nice is to be able to specify:<br><br><pre sty=
le=3D"background-color:rgb(43,43,43);color:rgb(169,183,198);font-family:Men=
lo;font-size:9pt"><span style=3D"color:rgb(204,120,50);font-weight:bold">au=
to </span>ds =3D wrapper::core::dynamic_c_<wbr>string(adopt: ps)<span style=
=3D"color:rgb(204,120,50)">;<br></span></pre><br></div><div>Which in effect=
 means &#39;search for the name &#39;adopt&#39; in the callee&#39;s namespa=
ce rather than the caller&#39;s.</div><div><br></div><div>I think there is =
a reasonable argument for exploring this use case.=C2=A0</div></div></block=
quote><div><br></div><div>I mentioned something to this effect on another t=
hread.<span style=3D"background-color:transparent;border-bottom-color:rgb(3=
4,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-co=
lor:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(3=
4,34,34);display:inline;float:none;font-family:arial,sans-serif;font-size:1=
3px;font-style:normal;font-variant:normal;font-weight:400;letter-spacing:no=
rmal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-alig=
n:left;text-decoration:none;text-indent:0px;text-transform:none;white-space=
:normal;word-spacing:0px"> It was essentially the ability to deduce the ful=
l &quot;pathname&quot; of an identifier from the location where that identi=
fier gets used. Such syntax would be useful in a number of places.</span></=
div><div><span style=3D"background-color:transparent;border-bottom-color:rg=
b(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-co=
lor:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right=
-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-=
top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rg=
b(34,34,34);display:inline;float:none;font-family:arial,sans-serif;font-siz=
e:13px;font-style:normal;font-variant:normal;font-weight:400;letter-spacing=
:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;p=
adding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-a=
lign:left;text-decoration:none;text-indent:0px;text-transform:none;white-sp=
ace:normal;word-spacing:0px"><br></span></div><div><span style=3D"backgroun=
d-color:transparent;border-bottom-color:rgb(34,34,34);border-bottom-style:n=
one;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-right=
-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-to=
p-style:none;border-top-width:0px;color:rgb(34,34,34);display:inline;float:=
none;font-family:arial,sans-serif;font-size:13px;font-style:normal;font-var=
iant:normal;font-weight:400;letter-spacing:normal;margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px;text-align:left;text-decoration:none;te=
xt-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Swit=
ching over an `enum class` is a place where people often find it annoying t=
o have to re-type `EnumName::` before the enumerators, even though the comp=
iler knows statically where the enumerator comes from. Now obviously you ca=
n&#39;t use `identifier:` for that syntax, since `case` statements are term=
inated by `:` characters. But the principle is meaningful.</span></div><div=
><span style=3D"background-color:transparent;border-bottom-color:rgb(34,34,=
34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(=
34,34,34);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(34,34,34);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,=
34);display:inline;float:none;font-family:arial,sans-serif;font-size:13px;f=
ont-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-align:lef=
t;text-decoration:none;text-indent:0px;text-transform:none;white-space:norm=
al;word-spacing:0px"><br></span></div><div><span style=3D"background-color:=
transparent;border-bottom-color:rgb(34,34,34);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;=
border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:n=
one;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:=
none;border-top-width:0px;color:rgb(34,34,34);display:inline;float:none;fon=
t-family:arial,sans-serif;font-size:13px;font-style:normal;font-variant:nor=
mal;font-weight:400;letter-spacing:normal;margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px;text-align:left;text-decoration:none;text-inden=
t:0px;text-transform:none;white-space:normal;word-spacing:0px">The problem =
of course is that this is somewhat orthogonal to what this proposal is tryi=
ng to achieve. That is, this proposal does do full &quot;pathname&quot; sea=
rch of these types, but only as a consequence of its far more specific goal=
.. As I said in the other thread, it&#39;s like Gor-coroutines vs. Core-coro=
utines: policy vs. mechanisms. Policies can only be used for one thing, whi=
le mechanisms can be used for a plethora of things.</span></div><div><span =
style=3D"background-color:transparent;border-bottom-color:rgb(34,34,34);bor=
der-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,3=
4);border-left-style:none;border-left-width:0px;border-right-color:rgb(34,3=
4,34);border-right-style:none;border-right-width:0px;border-top-color:rgb(3=
4,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34);dis=
play:inline;float:none;font-family:arial,sans-serif;font-size:13px;font-sty=
le:normal;font-variant:normal;font-weight:400;letter-spacing:normal;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px;text-align:left;text-=
decoration:none;text-indent:0px;text-transform:none;white-space:normal;word=
-spacing:0px"><br></span></div><div><span style=3D"background-color:transpa=
rent;border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-=
left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bor=
der-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bo=
rder-top-width:0px;color:rgb(34,34,34);display:inline;float:none;font-famil=
y:arial,sans-serif;font-size:13px;font-style:normal;font-variant:normal;fon=
t-weight:400;letter-spacing:normal;margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px;text-align:left;text-decoration:none;text-indent:0px;t=
ext-transform:none;white-space:normal;word-spacing:0px">Basically, with &qu=
ot;pathname&quot; identifier lookup syntax, you get get the effect of this =
proposal, except that you need to do `{},` after such tags. The OP seems to=
 think that this is not good enough, that we really need to disguise the fa=
ct that an argument is an argument, so the more general mechanis is unlikel=
y to be pursued by them.<br></span></div><blockquote class=3D"gmail_quote" =
style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-l=
eft: 1ex;">
</blockquote></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/8ffa3adb-29ab-49bb-8a84-56bea1fafc74%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/8ffa3adb-29ab-49bb-8a84-56bea1fafc74=
%40isocpp.org</a>.<br />

------=_Part_3689_1198163692.1532016051609--

------=_Part_3688_1075519921.1532016051608--

.


Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 19 Jul 2018 09:09:23 -0700 (PDT)
Raw View
------=_Part_3787_1151706192.1532016563563
Content-Type: multipart/alternative;
 boundary="----=_Part_3788_24419859.1532016563563"

------=_Part_3788_24419859.1532016563563
Content-Type: text/plain; charset="UTF-8"

On Thursday, July 19, 2018 at 12:00:51 PM UTC-4, Nicol Bolas wrote:
>
> Basically, with "pathname" identifier lookup syntax, you get get the
> effect of this proposal, except that you need to do `{},` after such tags.
> The OP seems to think that this is not good enough, that we really need to
> disguise the fact that an argument is an argument, so the more general
> mechanis is unlikely to be pursued by them.
>

I should correct this. Because of inline variables, such syntax would not
even need `{}`. So armed with such syntax (which we can debate), you would
be able to do this, where `adopt` is an inline variable:

auto ds = wrapper::core::dynamic_c_string(adopt:, ps);

as opposed to the OP's idea of this:

auto ds = wrapper::core::dynamic_c_string(adopt: ps);

That is, with the OP's idea, you get to drop a comma. With mine, you have
to use a comma and a variable template, but you solve a bunch of other
problems too.

--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7%40isocpp.org.

------=_Part_3788_24419859.1532016563563
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">On Thursday, July 19, 2018 at 12:00:51 PM UTC-4, Nicol Bol=
as wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: =
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div=
><span style=3D"background-color:transparent;border-bottom-color:rgb(34,34,=
34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(=
34,34,34);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(34,34,34);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,=
34);display:inline;float:none;font-family:arial,sans-serif;font-size:13px;f=
ont-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-align:lef=
t;text-decoration:none;text-indent:0px;text-transform:none;white-space:norm=
al;word-spacing:0px">Basically, with &quot;pathname&quot; identifier lookup=
 syntax, you get get the effect of this proposal, except that you need to d=
o `{},` after such tags. The OP seems to think that this is not good enough=
, that we really need to disguise the fact that an argument is an argument,=
 so the more general mechanis is unlikely to be pursued by them.<br></span>=
</div></div></blockquote><div><br></div><div>I should correct this. Because=
 of inline variables, such syntax would not even need `{}`. So armed with s=
uch syntax (which we can debate), you would be able to do this, where `adop=
t` is an inline variable:</div><div><br></div><div><div style=3D"background=
-color: rgb(250, 250, 250); border-color: rgb(187, 187, 187); border-style:=
 solid; border-width: 1px; overflow-wrap: break-word;" class=3D"prettyprint=
"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span style=3D"=
color: #008;" class=3D"styled-by-prettify">auto</span><span style=3D"color:=
 #000;" class=3D"styled-by-prettify"> ds </span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> wrapper</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">::</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify">core</span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">::</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
">dynamic_c_string</span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">(</span><span style=3D"color: #000;" class=3D"styled-by-prettify">a=
dopt</span><span style=3D"color: #660;" class=3D"styled-by-prettify">:,</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"> ps</span><spa=
n style=3D"color: #660;" class=3D"styled-by-prettify">);</span></div></code=
></div></div><div><br></div><div>as opposed to the OP&#39;s idea of this:</=
div><div><br></div><div><div style=3D"background-color: rgb(250, 250, 250);=
 border-color: rgb(187, 187, 187); border-style: solid; border-width: 1px; =
overflow-wrap: break-word;" class=3D"prettyprint"><code class=3D"prettyprin=
t"><div class=3D"subprettyprint"><span style=3D"color: #008;" class=3D"styl=
ed-by-prettify">auto</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> ds </span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> wr=
apper</span><span style=3D"color: #660;" class=3D"styled-by-prettify">::</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify">core</span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">::</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify">dynamic_c_string</span><spa=
n style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify">adopt</span><span style=3D"c=
olor: #660;" class=3D"styled-by-prettify">:</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"> ps</span><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">);</span></div></code></div><br></div><div>That i=
s, with the OP&#39;s idea, you get to drop a comma. With mine, you have to =
use a comma and a variable template, but you solve a bunch of other problem=
s too.<br></div><div><br></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7=
%40isocpp.org</a>.<br />

------=_Part_3788_24419859.1532016563563--

------=_Part_3787_1151706192.1532016563563--

.


Author: mihailnajdenov@gmail.com
Date: Thu, 19 Jul 2018 11:30:42 -0700 (PDT)
Raw View
------=_Part_4080_3955265.1532025043029
Content-Type: multipart/alternative;
 boundary="----=_Part_4081_465410257.1532025043030"

------=_Part_4081_465410257.1532025043030
Content-Type: text/plain; charset="UTF-8"



On Thursday, July 19, 2018 at 7:09:23 PM UTC+3, Nicol Bolas wrote:
>
> On Thursday, July 19, 2018 at 12:00:51 PM UTC-4, Nicol Bolas wrote:
>>
>> Basically, with "pathname" identifier lookup syntax, you get get the
>> effect of this proposal, except that you need to do `{},` after such tags.
>> The OP seems to think that this is not good enough, that we really need to
>> disguise the fact that an argument is an argument, so the more general
>> mechanis is unlikely to be pursued by them.
>>
>
> I should correct this. Because of inline variables, such syntax would not
> even need `{}`. So armed with such syntax (which we can debate), you would
> be able to do this, where `adopt` is an inline variable:
>
> auto ds = wrapper::core::dynamic_c_string(adopt:, ps);
>
> as opposed to the OP's idea of this:
>
> auto ds = wrapper::core::dynamic_c_string(adopt: ps);
>
> That is, with the OP's idea, you get to drop a comma. With mine, you have
> to use a comma and a variable template, but you solve a bunch of other
> problems too.
>

Well, you don't *have* to drop the comma, the first is still valid. The
colon is just to pick the fully qualified variable.

*Arguably*, this could work without the colon, just by a virtue of being a
label type.



And I guess the Enum case you mean is like this

enum class A{ yes, no };
enum class B{ yes, no };

func(A, int);

// use

func(yes, 2); //< works

I am worried, people will feel, we are going back,
but that aside, enums already contribute to ADL, and this will complicate
things, unless we use new syntax like :yes
This will tell the compiler to *not* find the argument first, but last,
after the function, then he will be able to prepend A.

So I guess this could extend to other case, but it either needs syntax *or*,
not sure if possible, some sort of template specialization - can template
specializations control such things, I doubt it.


However note this is not the same as with label arguments. This one is
looking in the scope of the argument (enums, classes), labels look in the
scope of the function itself.

To make it *also* look in the function namespace first is de facto a
different rule.



--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/2af70609-f169-4d9f-9280-13def081bf91%40isocpp.org.

------=_Part_4081_465410257.1532025043030
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Thursday, July 19, 2018 at 7:09:23 PM UTC+3, Ni=
col Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin=
-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"lt=
r">On Thursday, July 19, 2018 at 12:00:51 PM UTC-4, Nicol Bolas wrote:<bloc=
kquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-lef=
t:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><span style=3D"bac=
kground-color:transparent;border-bottom-color:rgb(34,34,34);border-bottom-s=
tyle:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-le=
ft-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border=
-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bor=
der-top-style:none;border-top-width:0px;color:rgb(34,34,34);display:inline;=
float:none;font-family:arial,sans-serif;font-size:13px;font-style:normal;fo=
nt-variant:normal;font-weight:400;letter-spacing:normal;margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-l=
eft:0px;padding-right:0px;padding-top:0px;text-align:left;text-decoration:n=
one;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px=
">Basically, with &quot;pathname&quot; identifier lookup syntax, you get ge=
t the effect of this proposal, except that you need to do `{},` after such =
tags. The OP seems to think that this is not good enough, that we really ne=
ed to disguise the fact that an argument is an argument, so the more genera=
l mechanis is unlikely to be pursued by them.<br></span></div></div></block=
quote><div><br></div><div>I should correct this. Because of inline variable=
s, such syntax would not even need `{}`. So armed with such syntax (which w=
e can debate), you would be able to do this, where `adopt` is an inline var=
iable:</div><div><br></div><div><div style=3D"background-color:rgb(250,250,=
250);border-color:rgb(187,187,187);border-style:solid;border-width:1px"><co=
de><div><span style=3D"color:#008">auto</span><span style=3D"color:#000"> d=
s </span><span style=3D"color:#660">=3D</span><span style=3D"color:#000"> w=
rapper</span><span style=3D"color:#660">::</span><span style=3D"color:#000"=
>core</span><span style=3D"color:#660">::</span><span style=3D"color:#000">=
dynamic_c_<wbr>string</span><span style=3D"color:#660">(</span><span style=
=3D"color:#000">adopt</span><span style=3D"color:#660">:,</span><span style=
=3D"color:#000"> ps</span><span style=3D"color:#660">);</span></div></code>=
</div></div><div><br></div><div>as opposed to the OP&#39;s idea of this:</d=
iv><div><br></div><div><div style=3D"background-color:rgb(250,250,250);bord=
er-color:rgb(187,187,187);border-style:solid;border-width:1px"><code><div><=
span style=3D"color:#008">auto</span><span style=3D"color:#000"> ds </span>=
<span style=3D"color:#660">=3D</span><span style=3D"color:#000"> wrapper</s=
pan><span style=3D"color:#660">::</span><span style=3D"color:#000">core</sp=
an><span style=3D"color:#660">::</span><span style=3D"color:#000">dynamic_c=
_<wbr>string</span><span style=3D"color:#660">(</span><span style=3D"color:=
#000">adopt</span><span style=3D"color:#660">:</span><span style=3D"color:#=
000"> ps</span><span style=3D"color:#660">);</span></div></code></div><br><=
/div><div>That is, with the OP&#39;s idea, you get to drop a comma. With mi=
ne, you have to use a comma and a variable template, but you solve a bunch =
of other problems too.<br></div></div></blockquote><div><br></div><div>Well=
, you don&#39;t <i>have</i> to drop the comma, the first is still valid. Th=
e colon is just to pick the fully qualified variable.<br></div><div><br></d=
iv><div><i>Arguably</i>, this could work without the colon, just by a virtu=
e of being a label type.=C2=A0</div><div><br></div><div><br></div><div><br>=
</div><div>And I guess the Enum case you mean is like this</div><div><br></=
div><div><font face=3D"courier new,monospace">enum class A{ yes, no };</fon=
t><br style=3D"background-attachment: scroll; background-clip: border-box; =
background-color: transparent; background-image: none; background-origin: p=
adding-box; background-position-x: 0%; background-position-y: 0%; backgroun=
d-repeat: repeat; background-size: auto; border-bottom-color: rgb(34, 34, 3=
4); border-bottom-style: none; border-bottom-width: 0px; border-image-outse=
t: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-=
source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bo=
rder-left-style: none; border-left-width: 0px; border-right-color: rgb(34, =
34, 34); border-right-style: none; border-right-width: 0px; border-top-colo=
r: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: r=
gb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&=
amp;quot;,sans-serif; font-size: 13px; height: auto; margin-bottom: 0px; ma=
rgin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overflo=
w: visible; overflow-x: visible; overflow-y: visible; padding-bottom: 0px; =
padding-left: 0px; padding-right: 0px; padding-top: 0px;"></div><div><div s=
tyle=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34)=
; border-bottom-style: none; border-bottom-width: 0px; border-image-outset:=
 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-so=
urce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bord=
er-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34=
, 34); border-right-style: none; border-right-width: 0px; border-top-color:=
 rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb=
(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&am=
p;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: norm=
al; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-le=
ft: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0p=
x; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: lef=
t; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-t=
ext-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><font face=
=3D"courier new,monospace" style=3D"border-bottom-color: rgb(34, 34, 34); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
 border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-=
left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 3=
4); border-right-style: none; border-right-width: 0px; border-top-color: rg=
b(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom=
: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom=
: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">enum class=
 B{ yes, no };</font></div><b></b><i></i><u></u><sub></sub><sup></sup><stri=
ke></strike><br></div><div><font face=3D"courier new,monospace">func(A, int=
);</font></div><div><font face=3D"courier new,monospace"></font><br></div><=
div><font face=3D"courier new,monospace">// use</font></div><div><font face=
=3D"courier new,monospace"></font><br></div><div><font face=3D"courier new,=
monospace">func(yes, 2); //&lt; works</font></div><div><font face=3D"courie=
r new,monospace"><br></font></div><div><font face=3D"arial,sans-serif">I am=
 worried, people will feel, we are going back,</font><font face=3D"arial,sa=
ns-serif"><br></font></div><div><font face=3D"arial,sans-serif">but that as=
ide, enums already contribute to ADL, and this </font>will <font face=3D"ar=
ial,sans-serif">complicate things, </font>unless <font face=3D"arial,sans-s=
erif">we use new syntax like </font><font face=3D"courier new,monospace">:y=
es</font></div><div><font face=3D"arial,sans-serif">This will tell the comp=
iler to <i>not</i> find the argument first, but last, after the function, t=
hen he will be able to prepend A.</font></div><div><font face=3D"arial,sans=
-serif"><br></font></div><div><font face=3D"arial,sans-serif">So I guess th=
is could extend to other case, but it either needs syntax <i>or</i>, not su=
re if possible, some sort of template specialization - can template special=
izations control such things, I doubt it.=C2=A0</font></div><div><font face=
=3D"arial,sans-serif"><br></font></div><div><font face=3D"arial,sans-serif"=
><br></font></div><div><font face=3D"arial,sans-serif">However note this is=
 not the same as with label arguments. </font>This one is looking in the sc=
ope of the argument (enums, classes), labels look in the scope of the funct=
ion itself.</div><div><font face=3D"arial,sans-serif"><br></font></div><div=
><font face=3D"arial,sans-serif">To make it <i>also</i> look in the functio=
n namespace first is de facto a different rule.=C2=A0</font></div><div><fon=
t face=3D"arial,sans-serif"><br></font></div><div><font face=3D"arial,sans-=
serif"><br></font></div><div></div><div><font face=3D"arial,sans-serif"></f=
ont><br></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/2af70609-f169-4d9f-9280-13def081bf91%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/2af70609-f169-4d9f-9280-13def081bf91=
%40isocpp.org</a>.<br />

------=_Part_4081_465410257.1532025043030--

------=_Part_4080_3955265.1532025043029--

.


Author: mihailnajdenov@gmail.com
Date: Fri, 20 Jul 2018 13:21:16 -0700 (PDT)
Raw View
------=_Part_6136_1337199084.1532118076525
Content-Type: multipart/alternative;
 boundary="----=_Part_6137_1571872684.1532118076525"

------=_Part_6137_1571872684.1532118076525
Content-Type: text/plain; charset="UTF-8"



On Thursday, July 19, 2018 at 7:00:51 PM UTC+3, Nicol Bolas wrote:
>
>
>
> On Thursday, July 19, 2018 at 4:57:48 AM UTC-4, Richard Hodges wrote:
>>
>> Sorry for the top post. Perhaps the group could let me know if this is
>> worthy of a separate thread.
>> ...
>>
>
> I mentioned something to this effect on another thread. It was
> essentially the ability to deduce the full "pathname" of an identifier from
> the location where that identifier gets used. Such syntax would be useful
> in a number of places.
>
> Switching over an `enum class` is a place where people often find it
> annoying to have to re-type `EnumName::` before the enumerators, even
> though the compiler knows statically where the enumerator comes from. Now
> obviously you can't use `identifier:` for that syntax, since `case`
> statements are terminated by `:` characters. But the principle is
> meaningful.
>
>
Just saw this: Using Enum
<http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2018/p1099r0.html>


The problem of course is that this is somewhat orthogonal to what this
> proposal is trying to achieve. That is, this proposal does do full
> "pathname" search of these types, but only as a consequence of its far more
> specific goal. As I said in the other thread, it's like Gor-coroutines vs.
> Core-coroutines: policy vs. mechanisms. Policies can only be used for one
> thing, while mechanisms can be used for a plethora of things.
>
> Basically, with "pathname" identifier lookup syntax, you get get the
> effect of this proposal, except that you need to do `{},` after such tags.
> The OP seems to think that this is not good enough, that we really need to
> disguise the fact that an argument is an argument, so the more general
> mechanis is unlikely to be pursued by them.
>
>>

--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/2b354733-6330-4086-9384-fe67cf9e2f17%40isocpp.org.

------=_Part_6137_1571872684.1532118076525
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Thursday, July 19, 2018 at 7:00:51 PM UTC+3, Ni=
col Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin=
-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"lt=
r"><br><br>On Thursday, July 19, 2018 at 4:57:48 AM UTC-4, Richard Hodges w=
rote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;=
border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">Sorry for the=
 top post. Perhaps the group could let me know if this is worthy of a separ=
ate thread.<div>...</div></div></blockquote><div><br></div><div>I mentioned=
 something to this effect on another thread.<span style=3D"background-color=
:transparent;border-bottom-color:rgb(34,34,34);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none=
;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:=
none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style=
:none;border-top-width:0px;color:rgb(34,34,34);display:inline;float:none;fo=
nt-family:arial,sans-serif;font-size:13px;font-style:normal;font-variant:no=
rmal;font-weight:400;letter-spacing:normal;margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px;text-align:left;text-decoration:none;text-inde=
nt:0px;text-transform:none;white-space:normal;word-spacing:0px"> It was ess=
entially the ability to deduce the full &quot;pathname&quot; of an identifi=
er from the location where that identifier gets used. Such syntax would be =
useful in a number of places.</span></div><div><span style=3D"background-co=
lor:transparent;border-bottom-color:rgb(34,34,34);border-bottom-style:none;=
border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-sty=
le:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-st=
yle:none;border-top-width:0px;color:rgb(34,34,34);display:inline;float:none=
;font-family:arial,sans-serif;font-size:13px;font-style:normal;font-variant=
:normal;font-weight:400;letter-spacing:normal;margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px;text-align:left;text-decoration:none;text-i=
ndent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></sp=
an></div><div><span style=3D"background-color:transparent;border-bottom-col=
or:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-le=
ft-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;bo=
rder-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;col=
or:rgb(34,34,34);display:inline;float:none;font-family:arial,sans-serif;fon=
t-size:13px;font-style:normal;font-variant:normal;font-weight:400;letter-sp=
acing:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:=
0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;t=
ext-align:left;text-decoration:none;text-indent:0px;text-transform:none;whi=
te-space:normal;word-spacing:0px">Switching over an `enum class` is a place=
 where people often find it annoying to have to re-type `EnumName::` before=
 the enumerators, even though the compiler knows statically where the enume=
rator comes from. Now obviously you can&#39;t use `identifier:` for that sy=
ntax, since `case` statements are terminated by `:` characters. But the pri=
nciple is meaningful.</span></div><div><span style=3D"background-color:tran=
sparent;border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;bord=
er-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;=
border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none=
;border-top-width:0px;color:rgb(34,34,34);display:inline;float:none;font-fa=
mily:arial,sans-serif;font-size:13px;font-style:normal;font-variant:normal;=
font-weight:400;letter-spacing:normal;margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px;text-align:left;text-decoration:none;text-indent:0p=
x;text-transform:none;white-space:normal;word-spacing:0px"><br></span></div=
></div></blockquote><div><br></div><div>Just saw this: <a href=3D"http://ww=
w.open-std.org/JTC1/SC22/WG21/docs/papers/2018/p1099r0.html">Using Enum</a>=
</div><div>=C2=A0</div><div><br></div><blockquote class=3D"gmail_quote" sty=
le=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left=
: 1ex;"><div dir=3D"ltr"><div><span style=3D"background-color:transparent;b=
order-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-wid=
th:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-w=
idth:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-t=
op-width:0px;color:rgb(34,34,34);display:inline;float:none;font-family:aria=
l,sans-serif;font-size:13px;font-style:normal;font-variant:normal;font-weig=
ht:400;letter-spacing:normal;margin-bottom:0px;margin-left:0px;margin-right=
:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;p=
adding-top:0px;text-align:left;text-decoration:none;text-indent:0px;text-tr=
ansform:none;white-space:normal;word-spacing:0px"></span></div><div><span s=
tyle=3D"background-color:transparent;border-bottom-color:rgb(34,34,34);bord=
er-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34=
);border-left-style:none;border-left-width:0px;border-right-color:rgb(34,34=
,34);border-right-style:none;border-right-width:0px;border-top-color:rgb(34=
,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34);disp=
lay:inline;float:none;font-family:arial,sans-serif;font-size:13px;font-styl=
e:normal;font-variant:normal;font-weight:400;letter-spacing:normal;margin-b=
ottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0p=
x;padding-left:0px;padding-right:0px;padding-top:0px;text-align:left;text-d=
ecoration:none;text-indent:0px;text-transform:none;white-space:normal;word-=
spacing:0px">The problem of course is that this is somewhat orthogonal to w=
hat this proposal is trying to achieve. That is, this proposal does do full=
 &quot;pathname&quot; search of these types, but only as a consequence of i=
ts far more specific goal. As I said in the other thread, it&#39;s like Gor=
-coroutines vs. Core-coroutines: policy vs. mechanisms. Policies can only b=
e used for one thing, while mechanisms can be used for a plethora of things=
..</span></div><div><span style=3D"background-color:transparent;border-botto=
m-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bord=
er-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;bo=
rder-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0=
px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0p=
x;color:rgb(34,34,34);display:inline;float:none;font-family:arial,sans-seri=
f;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;lett=
er-spacing:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px;text-align:left;text-decoration:none;text-indent:0px;text-transform:non=
e;white-space:normal;word-spacing:0px"><br></span></div><div><span style=3D=
"background-color:transparent;border-bottom-color:rgb(34,34,34);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);borde=
r-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34)=
;border-top-style:none;border-top-width:0px;color:rgb(34,34,34);display:inl=
ine;float:none;font-family:arial,sans-serif;font-size:13px;font-style:norma=
l;font-variant:normal;font-weight:400;letter-spacing:normal;margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px;text-align:left;text-decorati=
on:none;text-indent:0px;text-transform:none;white-space:normal;word-spacing=
:0px">Basically, with &quot;pathname&quot; identifier lookup syntax, you ge=
t get the effect of this proposal, except that you need to do `{},` after s=
uch tags. The OP seems to think that this is not good enough, that we reall=
y need to disguise the fact that an argument is an argument, so the more ge=
neral mechanis is unlikely to be pursued by them.<br></span></div><blockquo=
te class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
</blockquote></div></blockquote></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/2b354733-6330-4086-9384-fe67cf9e2f17%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/2b354733-6330-4086-9384-fe67cf9e2f17=
%40isocpp.org</a>.<br />

------=_Part_6137_1571872684.1532118076525--

------=_Part_6136_1337199084.1532118076525--

.


Author: Richard Hodges <hodges.r@gmail.com>
Date: Fri, 20 Jul 2018 23:10:40 +0200
Raw View
--0000000000000d157a057174bbb4
Content-Type: text/plain; charset="UTF-8"

On Thu, 19 Jul 2018 at 18:09, Nicol Bolas <jmckesson@gmail.com> wrote:

> On Thursday, July 19, 2018 at 12:00:51 PM UTC-4, Nicol Bolas wrote:
>>
>> Basically, with "pathname" identifier lookup syntax, you get get the
>> effect of this proposal, except that you need to do `{},` after such tags.
>> The OP seems to think that this is not good enough, that we really need to
>> disguise the fact that an argument is an argument, so the more general
>> mechanis is unlikely to be pursued by them.
>>
>
> I should correct this. Because of inline variables, such syntax would not
> even need `{}`. So armed with such syntax (which we can debate), you would
> be able to do this, where `adopt` is an inline variable:
>
> auto ds = wrapper::core::dynamic_c_string(adopt:, ps);
>
> as opposed to the OP's idea of this:
>
> auto ds = wrapper::core::dynamic_c_string(adopt: ps);
>
> That is, with the OP's idea, you get to drop a comma. With mine, you have
> to use a comma and a variable template, but you solve a bunch of other
> problems too.
>

Hmm. How about:

auto ds = wrapper::core::dyanmic_c_string(.adopt=ps);

Which logically would be a synonym for:

auto ds = wrapper::core::dyanmic_c_string(.adopt(ps));


I don't think this syntax conflicts with any other. The idea being that the
leading "." implies "current context, or current namespace". It's akin to
the old convenient VB syntax of:

with foo
  .a = b
  .doSomething()
end with


It also starts to look like named arguments, which are a nice feature of
(for example) python.

I'm wondering how you think this looks:

void test()
{
  auto p = geometry::point{.polar={.angle=1.4, .length=6.0}};
}

Given that this has already been defined:

namespace geometry {

  struct cartesian
  {
    double x, y;
  };

  struct angle {
    angle(double rads);
    double rads_;
  };

  struct length {
    angle(double len);
    double len_;
  };

  struct polar
  {
    polar(angle, length);
    angle a;
    length r;
  };

  struct point
  {
    point(cartesian);
    point(polar);
  };
}

It's expressive, but is it too much?



>
> --
> 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
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> To view this discussion on the web visit
> https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>

--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3haSF9Vk23dBQ0%2BOhamOY6boPu6uD55HNmO1PYJv9Rpn4Q%40mail.gmail.com.

--0000000000000d157a057174bbb4
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br><div class=3D"gmail_quote"><div dir=3D"ltr">On Thu=
, 19 Jul 2018 at 18:09, Nicol Bolas &lt;<a href=3D"mailto:jmckesson@gmail.c=
om">jmckesson@gmail.com</a>&gt; wrote:<br></div><blockquote class=3D"gmail_=
quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1=
ex"><div dir=3D"ltr">On Thursday, July 19, 2018 at 12:00:51 PM UTC-4, Nicol=
 Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-lef=
t:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>=
<span style=3D"background-color:transparent;border-bottom-color:rgb(34,34,3=
4);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(3=
4,34,34);border-left-style:none;border-left-width:0px;border-right-color:rg=
b(34,34,34);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,3=
4);display:inline;float:none;font-family:arial,sans-serif;font-size:13px;fo=
nt-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-align:left=
;text-decoration:none;text-indent:0px;text-transform:none;white-space:norma=
l;word-spacing:0px">Basically, with &quot;pathname&quot; identifier lookup =
syntax, you get get the effect of this proposal, except that you need to do=
 `{},` after such tags. The OP seems to think that this is not good enough,=
 that we really need to disguise the fact that an argument is an argument, =
so the more general mechanis is unlikely to be pursued by them.<br></span><=
/div></div></blockquote><div><br></div><div>I should correct this. Because =
of inline variables, such syntax would not even need `{}`. So armed with su=
ch syntax (which we can debate), you would be able to do this, where `adopt=
` is an inline variable:</div><div><br></div><div><div style=3D"background-=
color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;bor=
der-width:1px" class=3D"m_830926286455100642prettyprint"><code class=3D"m_8=
30926286455100642prettyprint"><div class=3D"m_830926286455100642subprettypr=
int"><span style=3D"color:#008" class=3D"m_830926286455100642styled-by-pret=
tify">auto</span><span style=3D"color:#000" class=3D"m_830926286455100642st=
yled-by-prettify"> ds </span><span style=3D"color:#660" class=3D"m_83092628=
6455100642styled-by-prettify">=3D</span><span style=3D"color:#000" class=3D=
"m_830926286455100642styled-by-prettify"> wrapper</span><span style=3D"colo=
r:#660" class=3D"m_830926286455100642styled-by-prettify">::</span><span sty=
le=3D"color:#000" class=3D"m_830926286455100642styled-by-prettify">core</sp=
an><span style=3D"color:#660" class=3D"m_830926286455100642styled-by-pretti=
fy">::</span><span style=3D"color:#000" class=3D"m_830926286455100642styled=
-by-prettify">dynamic_c_string</span><span style=3D"color:#660" class=3D"m_=
830926286455100642styled-by-prettify">(</span><span style=3D"color:#000" cl=
ass=3D"m_830926286455100642styled-by-prettify">adopt</span><span style=3D"c=
olor:#660" class=3D"m_830926286455100642styled-by-prettify">:,</span><span =
style=3D"color:#000" class=3D"m_830926286455100642styled-by-prettify"> ps</=
span><span style=3D"color:#660" class=3D"m_830926286455100642styled-by-pret=
tify">);</span></div></code></div></div><div><br></div><div>as opposed to t=
he OP&#39;s idea of this:</div><div><br></div><div><div style=3D"background=
-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;bo=
rder-width:1px" class=3D"m_830926286455100642prettyprint"><code class=3D"m_=
830926286455100642prettyprint"><div class=3D"m_830926286455100642subprettyp=
rint"><span style=3D"color:#008" class=3D"m_830926286455100642styled-by-pre=
ttify">auto</span><span style=3D"color:#000" class=3D"m_830926286455100642s=
tyled-by-prettify"> ds </span><span style=3D"color:#660" class=3D"m_8309262=
86455100642styled-by-prettify">=3D</span><span style=3D"color:#000" class=
=3D"m_830926286455100642styled-by-prettify"> wrapper</span><span style=3D"c=
olor:#660" class=3D"m_830926286455100642styled-by-prettify">::</span><span =
style=3D"color:#000" class=3D"m_830926286455100642styled-by-prettify">core<=
/span><span style=3D"color:#660" class=3D"m_830926286455100642styled-by-pre=
ttify">::</span><span style=3D"color:#000" class=3D"m_830926286455100642sty=
led-by-prettify">dynamic_c_string</span><span style=3D"color:#660" class=3D=
"m_830926286455100642styled-by-prettify">(</span><span style=3D"color:#000"=
 class=3D"m_830926286455100642styled-by-prettify">adopt</span><span style=
=3D"color:#660" class=3D"m_830926286455100642styled-by-prettify">:</span><s=
pan style=3D"color:#000" class=3D"m_830926286455100642styled-by-prettify"> =
ps</span><span style=3D"color:#660" class=3D"m_830926286455100642styled-by-=
prettify">);</span></div></code></div><br></div><div>That is, with the OP&#=
39;s idea, you get to drop a comma. With mine, you have to use a comma and =
a variable template, but you solve a bunch of other problems too.<br></div>=
</div></blockquote><div><br></div><div>Hmm. How about:</div><div><br></div>=
<div><font face=3D"monospace, monospace">auto ds =3D wrapper::core::dyanmic=
_c_string(.adopt=3Dps);</font></div><div><br></div><div>Which logically wou=
ld be a synonym for:</div><div><br></div><div><div style=3D"font-size:small=
;background-color:rgb(255,255,255);text-decoration-style:initial;text-decor=
ation-color:initial"><font face=3D"monospace, monospace">auto ds =3D wrappe=
r::core::dyanmic_c_string(.adopt(ps));</font></div><br></div><div><br></div=
><div>I don&#39;t think this syntax conflicts with any other. The idea bein=
g that the leading &quot;.&quot; implies &quot;current context, or current =
namespace&quot;. It&#39;s akin to the old convenient VB syntax of:</div><di=
v><br></div><div>with foo</div><div>=C2=A0 .a =3D b</div><div>=C2=A0 .doSom=
ething()</div><div>end with</div><div><br></div><div><br></div><div>It also=
 starts to look like named arguments, which are a nice feature of (for exam=
ple) python.</div><div><br></div><div>I&#39;m wondering how you think this =
looks:</div><div><br></div><div><div style=3D"font-size:small;background-co=
lor:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:in=
itial"><font face=3D"monospace, monospace">void test()</font></div><div sty=
le=3D"font-size:small;background-color:rgb(255,255,255);text-decoration-sty=
le:initial;text-decoration-color:initial"><font face=3D"monospace, monospac=
e">{</font></div><div style=3D"font-size:small;background-color:rgb(255,255=
,255);text-decoration-style:initial;text-decoration-color:initial"><font fa=
ce=3D"monospace, monospace">=C2=A0 auto p =3D geometry::point{.polar=3D{.an=
gle=3D1.4, .length=3D6.0}};</font></div><div style=3D"font-size:small;backg=
round-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-=
color:initial"><font face=3D"monospace, monospace">}</font></div><div style=
=3D"font-size:small;background-color:rgb(255,255,255);text-decoration-style=
:initial;text-decoration-color:initial"><br></div><div style=3D"font-size:s=
mall;background-color:rgb(255,255,255);text-decoration-style:initial;text-d=
ecoration-color:initial">Given that this has already been defined:</div><di=
v style=3D"font-size:small;background-color:rgb(255,255,255);text-decoratio=
n-style:initial;text-decoration-color:initial"><br></div><div style=3D"font=
-size:small;background-color:rgb(255,255,255);text-decoration-style:initial=
;text-decoration-color:initial"><span style=3D"font-family:monospace,monosp=
ace">namespace geometry {=C2=A0</span><br></div></div><div><font face=3D"mo=
nospace, monospace"><br></font></div><div><font face=3D"monospace, monospac=
e">=C2=A0 struct cartesian</font></div><div><font face=3D"monospace, monosp=
ace">=C2=A0 {</font></div><div><font face=3D"monospace, monospace">=C2=A0 =
=C2=A0 double x, y;</font></div><div><font face=3D"monospace, monospace">=
=C2=A0 };</font></div><div><font face=3D"monospace, monospace"><br></font><=
/div><div><font face=3D"monospace, monospace">=C2=A0 struct angle {</font><=
/div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 angle(double ra=
ds);</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 dou=
ble rads_;</font></div><div><font face=3D"monospace, monospace">=C2=A0 };</=
font></div><div><font face=3D"monospace, monospace"><br></font></div><div><=
div style=3D"font-size:small;background-color:rgb(255,255,255);text-decorat=
ion-style:initial;text-decoration-color:initial"><font face=3D"monospace, m=
onospace">=C2=A0 struct length {</font></div><div style=3D"font-size:small;=
background-color:rgb(255,255,255);text-decoration-style:initial;text-decora=
tion-color:initial"><font face=3D"monospace, monospace">=C2=A0 =C2=A0 angle=
(double len);</font></div><div style=3D"font-size:small;background-color:rg=
b(255,255,255);text-decoration-style:initial;text-decoration-color:initial"=
><font face=3D"monospace, monospace">=C2=A0 =C2=A0 double len_;</font></div=
><div style=3D"font-size:small;background-color:rgb(255,255,255);text-decor=
ation-style:initial;text-decoration-color:initial"><font face=3D"monospace,=
 monospace">=C2=A0 };</font></div><font face=3D"monospace, monospace"><br c=
lass=3D"gmail-Apple-interchange-newline">=C2=A0 struct polar<br></font></di=
v><div><div style=3D"font-size:small;background-color:rgb(255,255,255);text=
-decoration-style:initial;text-decoration-color:initial"><font face=3D"mono=
space, monospace">=C2=A0 {</font></div><div style=3D"font-size:small;backgr=
ound-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-c=
olor:initial"><font face=3D"monospace, monospace">=C2=A0 =C2=A0=C2=A0<span =
style=3D"font-size:small;background-color:rgb(255,255,255);text-decoration-=
style:initial;text-decoration-color:initial;float:none;display:inline">pola=
r(angle, length);</span></font></div><div style=3D"font-size:small;backgrou=
nd-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-col=
or:initial"><div style=3D"text-decoration-style:initial;text-decoration-col=
or:initial"><font face=3D"monospace, monospace">=C2=A0 =C2=A0 angle a;</fon=
t></div><div style=3D"text-decoration-style:initial;text-decoration-color:i=
nitial"><font face=3D"monospace, monospace">=C2=A0 =C2=A0 length r;</font><=
/div><font face=3D"monospace, monospace">=C2=A0 };<br></font></div><font fa=
ce=3D"monospace, monospace"><br class=3D"gmail-Apple-interchange-newline"><=
/font><span style=3D"font-family:monospace,monospace">=C2=A0 struct point</=
span><font face=3D"monospace, monospace"><br></font></div><div><font face=
=3D"monospace, monospace">=C2=A0 {</font></div><div><div style=3D"font-size=
:small;background-color:rgb(255,255,255);text-decoration-style:initial;text=
-decoration-color:initial"><font face=3D"monospace, monospace">=C2=A0 =C2=
=A0 point(cartesian);</font></div><div style=3D"font-size:small;background-=
color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:=
initial"><font face=3D"monospace, monospace">=C2=A0 =C2=A0 point(polar);</f=
ont></div><font face=3D"monospace, monospace">=C2=A0 };<br></font></div><di=
v><font face=3D"monospace, monospace">}<br></font></div><div><font face=3D"=
monospace, monospace"><br></font></div><div><div style=3D"font-size:small;b=
ackground-color:rgb(255,255,255);text-decoration-style:initial;text-decorat=
ion-color:initial"><div style=3D"font-size:small;background-color:rgb(255,2=
55,255);text-decoration-style:initial;text-decoration-color:initial">It&#39=
;s expressive, but is it too much?</div></div><br class=3D"gmail-Apple-inte=
rchange-newline">=C2=A0<br></div><blockquote class=3D"gmail_quote" style=3D=
"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D=
"ltr"><div></div><div><br></div></div>

<p></p>

-- <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" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7%=
40isocpp.org?utm_medium=3Demail&amp;utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-=
4115-9de2-56850de26da7%40isocpp.org</a>.<br>
</blockquote></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CALvx3haSF9Vk23dBQ0%2BOhamOY6boPu6uD5=
5HNmO1PYJv9Rpn4Q%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3haSF9Vk23=
dBQ0%2BOhamOY6boPu6uD55HNmO1PYJv9Rpn4Q%40mail.gmail.com</a>.<br />

--0000000000000d157a057174bbb4--

.


Author: mihailnajdenov@gmail.com
Date: Sat, 21 Jul 2018 08:38:57 -0700 (PDT)
Raw View
------=_Part_7340_274461139.1532187537531
Content-Type: multipart/alternative;
 boundary="----=_Part_7341_1398164291.1532187537531"

------=_Part_7341_1398164291.1532187537531
Content-Type: text/plain; charset="UTF-8"



On Saturday, July 21, 2018 at 12:10:53 AM UTC+3, Richard Hodges wrote:
>
>
>
> On Thu, 19 Jul 2018 at 18:09, Nicol Bolas <jmck...@gmail.com <javascript:>>
> wrote:
>
>> On Thursday, July 19, 2018 at 12:00:51 PM UTC-4, Nicol Bolas wrote:
>>>
>>> Basically, with "pathname" identifier lookup syntax, you get get the
>>> effect of this proposal, except that you need to do `{},` after such tags.
>>> The OP seems to think that this is not good enough, that we really need to
>>> disguise the fact that an argument is an argument, so the more general
>>> mechanis is unlikely to be pursued by them.
>>>
>>
>> I should correct this. Because of inline variables, such syntax would not
>> even need `{}`. So armed with such syntax (which we can debate), you would
>> be able to do this, where `adopt` is an inline variable:
>>
>> auto ds = wrapper::core::dynamic_c_string(adopt:, ps);
>>
>> as opposed to the OP's idea of this:
>>
>> auto ds = wrapper::core::dynamic_c_string(adopt: ps);
>>
>> That is, with the OP's idea, you get to drop a comma. With mine, you have
>> to use a comma and a variable template, but you solve a bunch of other
>> problems too.
>>
>
> Hmm. How about:
>
> auto ds = wrapper::core::dyanmic_c_string(.adopt=ps);
>

This way we "overload" assignment - sometimes it is real assignment,
sometimes it is for labeling/function calling.
As for the dot, the problem is in C++ scope is not a dot, but double colon,
the dot is used only for member access, and in a way we overloaded that as
well, semantically.
(That's why I suggested the single column prefix to donate "search in
scope" - to be closer to the double colon.)

But as I said, with using namespace, inline namespace and now eventually
using Enum I don't see the need a yet another way to skim on typing for
general arguments.
The labels are special case only because they need to be perceived "as if"
part of the function.
I might be wrong, there might e benefits generalizing this approach, but
fail to see real gain (contrarily to the labels)



>
> Which logically would be a synonym for:
>
> auto ds = wrapper::core::dyanmic_c_string(.adopt(ps));
>
>
> I don't think this syntax conflicts with any other. The idea being that
> the leading "." implies "current context, or current namespace". It's akin
> to the old convenient VB syntax of:
>
> with foo
>   .a = b
>   .doSomething()
> end with
>
>
> It also starts to look like named arguments, which are a nice feature of
> (for example) python.
>
> I'm wondering how you think this looks:
>
> void test()
> {
>   auto p = geometry::point{.polar={.angle=1.4, .length=6.0}};
> }
>

> Given that this has already been defined:
>
> namespace geometry {
>
>   struct cartesian
>   {
>     double x, y;
>   };
>
>   struct angle {
>     angle(double rads);
>     double rads_;
>   };
>
>   struct length {
>     angle(double len);
>     double len_;
>   };
>
>   struct polar
>   {
>     polar(angle, length);
>     angle a;
>     length r;
>   };
>
>   struct point
>   {
>     point(cartesian);
>     point(polar);
>   };
> }
>
> It's expressive, but is it too much?
>
>
>
>>
>> --
>> 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
>> email to std-proposal...@isocpp.org <javascript:>.
>> To post to this group, send email to std-pr...@isocpp.org <javascript:>.
>> To view this discussion on the web visit
>> https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7%40isocpp.org
>> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7%40isocpp.org?utm_medium=email&utm_source=footer>
>> .
>>
>

--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/624c641e-a10a-4d35-9384-b639a277e2d9%40isocpp.org.

------=_Part_7341_1398164291.1532187537531
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Saturday, July 21, 2018 at 12:10:53 AM UTC+3, R=
ichard Hodges wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;ma=
rgin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=
=3D"ltr"><br><br><div class=3D"gmail_quote"><div dir=3D"ltr">On Thu, 19 Jul=
 2018 at 18:09, Nicol Bolas &lt;<a onmousedown=3D"this.href=3D&#39;javascri=
pt:&#39;;return true;" onclick=3D"this.href=3D&#39;javascript:&#39;;return =
true;" href=3D"javascript:" target=3D"_blank" rel=3D"nofollow" gdf-obfuscat=
ed-mailto=3D"mSJvAouTCwAJ">jmck...@gmail.com</a>&gt; wrote:<br></div><block=
quote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc=
 solid;padding-left:1ex"><div dir=3D"ltr">On Thursday, July 19, 2018 at 12:=
00:51 PM UTC-4, Nicol Bolas wrote:<blockquote class=3D"gmail_quote" style=
=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"=
><div dir=3D"ltr"><div><span style=3D"background-color:transparent;border-b=
ottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-widt=
h:0px;color:rgb(34,34,34);display:inline;float:none;font-family:arial,sans-=
serif;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;=
letter-spacing:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;ma=
rgin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-=
top:0px;text-align:left;text-decoration:none;text-indent:0px;text-transform=
:none;white-space:normal;word-spacing:0px">Basically, with &quot;pathname&q=
uot; identifier lookup syntax, you get get the effect of this proposal, exc=
ept that you need to do `{},` after such tags. The OP seems to think that t=
his is not good enough, that we really need to disguise the fact that an ar=
gument is an argument, so the more general mechanis is unlikely to be pursu=
ed by them.<br></span></div></div></blockquote><div><br></div><div>I should=
 correct this. Because of inline variables, such syntax would not even need=
 `{}`. So armed with such syntax (which we can debate), you would be able t=
o do this, where `adopt` is an inline variable:</div><div><br></div><div><d=
iv style=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187)=
;border-style:solid;border-width:1px"><code><div><span style=3D"color:#008"=
>auto</span><span style=3D"color:#000"> ds </span><span style=3D"color:#660=
">=3D</span><span style=3D"color:#000"> wrapper</span><span style=3D"color:=
#660">::</span><span style=3D"color:#000">core</span><span style=3D"color:#=
660">::</span><span style=3D"color:#000">dynamic_c_<wbr>string</span><span =
style=3D"color:#660">(</span><span style=3D"color:#000">adopt</span><span s=
tyle=3D"color:#660">:,</span><span style=3D"color:#000"> ps</span><span sty=
le=3D"color:#660">);</span></div></code></div></div><div><br></div><div>as =
opposed to the OP&#39;s idea of this:</div><div><br></div><div><div style=
=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-=
style:solid;border-width:1px"><code><div><span style=3D"color:#008">auto</s=
pan><span style=3D"color:#000"> ds </span><span style=3D"color:#660">=3D</s=
pan><span style=3D"color:#000"> wrapper</span><span style=3D"color:#660">::=
</span><span style=3D"color:#000">core</span><span style=3D"color:#660">::<=
/span><span style=3D"color:#000">dynamic_c_<wbr>string</span><span style=3D=
"color:#660">(</span><span style=3D"color:#000">adopt</span><span style=3D"=
color:#660">:</span><span style=3D"color:#000"> ps</span><span style=3D"col=
or:#660">);</span></div></code></div><br></div><div>That is, with the OP&#3=
9;s idea, you get to drop a comma. With mine, you have to use a comma and a=
 variable template, but you solve a bunch of other problems too.<br></div><=
/div></blockquote><div><br></div><div>Hmm. How about:</div><div><br></div><=
div><font face=3D"monospace, monospace">auto ds =3D wrapper::core::dyanmic_=
c_<wbr>string(.adopt=3Dps);</font></div></div></div></blockquote><div><br><=
/div><div>This way we &quot;overload&quot; assignment - sometimes it is rea=
l assignment, sometimes it is for labeling/function calling.=C2=A0</div><di=
v>As for the dot, the problem is in C++ scope is not a dot, but double colo=
n, the dot is used only for member access, and in a way we overloaded that =
as well, semantically.</div><div>(That&#39;s why I suggested the single col=
umn prefix to donate &quot;search in scope&quot; - to be closer to the doub=
le colon.)</div><div><br></div><div>But as I said, with using namespace, in=
line namespace and now eventually using Enum I don&#39;t see the need a yet=
 another way to skim on typing for general arguments.</div><div>The labels =
are special case only because they need to be perceived &quot;as if&quot; p=
art of the function.=C2=A0</div><div>I might be wrong, there might e benefi=
ts generalizing this approach, but fail to see real gain (contrarily to the=
 labels)</div><div><br></div><div>=C2=A0</div><blockquote class=3D"gmail_qu=
ote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padd=
ing-left: 1ex;"><div dir=3D"ltr"><div class=3D"gmail_quote"><div><br></div>=
<div>Which logically would be a synonym for:</div><div><br></div><div><div =
style=3D"font-size:small;background-color:rgb(255,255,255)"><font face=3D"m=
onospace, monospace">auto ds =3D wrapper::core::dyanmic_c_<wbr>string(.adop=
t(ps));</font></div><br></div><div><br></div><div>I don&#39;t think this sy=
ntax conflicts with any other. The idea being that the leading &quot;.&quot=
; implies &quot;current context, or current namespace&quot;. It&#39;s akin =
to the old convenient VB syntax of:</div><div><br></div><div>with foo</div>=
<div>=C2=A0 .a =3D b</div><div>=C2=A0 .doSomething()</div><div>end with</di=
v><div><br></div><div><br></div><div>It also starts to look like named argu=
ments, which are a nice feature of (for example) python.</div><div><br></di=
v><div>I&#39;m wondering how you think this looks:</div><div><br></div><div=
><div style=3D"font-size:small;background-color:rgb(255,255,255)"><font fac=
e=3D"monospace, monospace">void test()</font></div><div style=3D"font-size:=
small;background-color:rgb(255,255,255)"><font face=3D"monospace, monospace=
">{</font></div><div style=3D"font-size:small;background-color:rgb(255,255,=
255)"><font face=3D"monospace, monospace">=C2=A0 auto p =3D geometry::point=
{.polar=3D{.<wbr>angle=3D1.4, .length=3D6.0}};</font></div><div style=3D"fo=
nt-size:small;background-color:rgb(255,255,255)"><font face=3D"monospace, m=
onospace">}</font>=C2=A0</div></div></div></div></blockquote><blockquote cl=
ass=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px =
#ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div class=3D"gmail_quote">=
<div><div style=3D"font-size:small;background-color:rgb(255,255,255)"><br><=
/div><div style=3D"font-size:small;background-color:rgb(255,255,255)">Given=
 that this has already been defined:</div><div style=3D"font-size:small;bac=
kground-color:rgb(255,255,255)"><br></div><div style=3D"font-size:small;bac=
kground-color:rgb(255,255,255)"><span style=3D"font-family:monospace,monosp=
ace">namespace geometry {=C2=A0</span><br></div></div><div><font face=3D"mo=
nospace, monospace"><br></font></div><div><font face=3D"monospace, monospac=
e">=C2=A0 struct cartesian</font></div><div><font face=3D"monospace, monosp=
ace">=C2=A0 {</font></div><div><font face=3D"monospace, monospace">=C2=A0 =
=C2=A0 double x, y;</font></div><div><font face=3D"monospace, monospace">=
=C2=A0 };</font></div><div><font face=3D"monospace, monospace"><br></font><=
/div><div><font face=3D"monospace, monospace">=C2=A0 struct angle {</font><=
/div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 angle(double ra=
ds);</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 dou=
ble rads_;</font></div><div><font face=3D"monospace, monospace">=C2=A0 };</=
font></div><div><font face=3D"monospace, monospace"><br></font></div><div><=
div style=3D"font-size:small;background-color:rgb(255,255,255)"><font face=
=3D"monospace, monospace">=C2=A0 struct length {</font></div><div style=3D"=
font-size:small;background-color:rgb(255,255,255)"><font face=3D"monospace,=
 monospace">=C2=A0 =C2=A0 angle(double len);</font></div><div style=3D"font=
-size:small;background-color:rgb(255,255,255)"><font face=3D"monospace, mon=
ospace">=C2=A0 =C2=A0 double len_;</font></div><div style=3D"font-size:smal=
l;background-color:rgb(255,255,255)"><font face=3D"monospace, monospace">=
=C2=A0 };</font></div><font face=3D"monospace, monospace"><br>=C2=A0 struct=
 polar<br></font></div><div><div style=3D"font-size:small;background-color:=
rgb(255,255,255)"><font face=3D"monospace, monospace">=C2=A0 {</font></div>=
<div style=3D"font-size:small;background-color:rgb(255,255,255)"><font face=
=3D"monospace, monospace">=C2=A0 =C2=A0=C2=A0<span style=3D"font-size:small=
;background-color:rgb(255,255,255);float:none;display:inline">polar(angle, =
length);</span></font></div><div style=3D"font-size:small;background-color:=
rgb(255,255,255)"><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 an=
gle a;</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 l=
ength r;</font></div><font face=3D"monospace, monospace">=C2=A0 };<br></fon=
t></div><font face=3D"monospace, monospace"><br></font><span style=3D"font-=
family:monospace,monospace">=C2=A0 struct point</span><font face=3D"monospa=
ce, monospace"><br></font></div><div><font face=3D"monospace, monospace">=
=C2=A0 {</font></div><div><div style=3D"font-size:small;background-color:rg=
b(255,255,255)"><font face=3D"monospace, monospace">=C2=A0 =C2=A0 point(car=
tesian);</font></div><div style=3D"font-size:small;background-color:rgb(255=
,255,255)"><font face=3D"monospace, monospace">=C2=A0 =C2=A0 point(polar);<=
/font></div><font face=3D"monospace, monospace">=C2=A0 };<br></font></div><=
div><font face=3D"monospace, monospace">}<br></font></div><div><font face=
=3D"monospace, monospace"><br></font></div><div><div style=3D"font-size:sma=
ll;background-color:rgb(255,255,255)"><div style=3D"font-size:small;backgro=
und-color:rgb(255,255,255)">It&#39;s expressive, but is it too much?</div><=
/div><br>=C2=A0<br></div><blockquote class=3D"gmail_quote" style=3D"margin:=
0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><d=
iv></div><div><br></div></div>

<p></p>

-- <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 onmousedown=3D"this.href=3D&#39;javascript:&#39;;return true;" o=
nclick=3D"this.href=3D&#39;javascript:&#39;;return true;" href=3D"javascrip=
t:" target=3D"_blank" rel=3D"nofollow" gdf-obfuscated-mailto=3D"mSJvAouTCwA=
J">std-proposal...@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a onmousedown=3D"this.href=3D&#39;jav=
ascript:&#39;;return true;" onclick=3D"this.href=3D&#39;javascript:&#39;;re=
turn true;" href=3D"javascript:" target=3D"_blank" rel=3D"nofollow" gdf-obf=
uscated-mailto=3D"mSJvAouTCwAJ">std-pr...@isocpp.org</a>.<br>
To view this discussion on the web visit <a onmousedown=3D"this.href=3D&#39=
;https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9=
-4115-9de2-56850de26da7%40isocpp.org?utm_medium\x3demail\x26utm_source\x3df=
ooter&#39;;return true;" onclick=3D"this.href=3D&#39;https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7=
%40isocpp.org?utm_medium\x3demail\x26utm_source\x3dfooter&#39;;return true;=
" href=3D"https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/ff08=
a552-4ef9-4115-9de2-56850de26da7%40isocpp.org?utm_medium=3Demail&amp;utm_so=
urce=3Dfooter" target=3D"_blank" rel=3D"nofollow">https://groups.google.com=
/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/ff08a552-4ef9-4115-<wbr>9de2-=
56850de26da7%40isocpp.org</a><wbr>.<br>
</blockquote></div></div>
</blockquote></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/624c641e-a10a-4d35-9384-b639a277e2d9%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/624c641e-a10a-4d35-9384-b639a277e2d9=
%40isocpp.org</a>.<br />

------=_Part_7341_1398164291.1532187537531--

------=_Part_7340_274461139.1532187537531--

.


Author: Bengt Gustafsson <bengt.gustafsson@beamways.com>
Date: Sat, 21 Jul 2018 15:49:41 -0700 (PDT)
Raw View
------=_Part_7462_538636660.1532213381401
Content-Type: multipart/alternative;
 boundary="----=_Part_7463_1987529786.1532213381402"

------=_Part_7463_1987529786.1532213381402
Content-Type: text/plain; charset="UTF-8"

I think you are mixing up type and parameter names. I assume that you mean
that .polar at the call site is a type name, but this is contrary to the C
named initializers which are member names (or here that would presumably
mean parameter names).

The possibility of defining separate polar and cartesian types has already
been mentioned and dismissed, so .polar at the call site must mean a
parameter name, which means that you have to reformulate your geometry
namespace contents. I think that this is the way to go, as the tag colon
syntax is very novel and as the declaration has to prepare for call sites
to be able to use the feature.

Proposing being able to use parameter names at call sites comes with the
mandatory objection that different declarations of the same function
signature may specify different parameter names. Currently this has no
effect other than confusion on the part of the human reader. To make the
example work it must be possible to overload on parameter names, which
means that two different declarations declare different functions with the
same set of types for their parameters. For old code that uses different
names we get different types of errors with the new definion:

1. For methods being implemented out of line we get an error that the
method is not declared in the class head.

2. For free functions we get two separate functions which can lead to
unresolved external errors from the linker.

3. Old call sites which have seen two type-equal declarations with
different parameter names and which do not mention any parameter names
(i.e. all old call sites) an ambiguous call error will result.

4. The mangled names will definitely be changed which is an ABI breakage.

5. If the same function declaration has implementation in both a direct
linked object file (with other parameter names than declaration) and a
library (with same parameter names as declaration). Currently this selects
the implementation from the object file and does not use the function in
the library during linking, while in the future the implementation from the
library will be used (as its mangled name matches).

Out of these I would be most concerned about 4, as there seems to be a
strong wish to not break ABI compatibility. At some point, maybe for C++23,
an ABI update may be desired as the backwards compatibility restrains
development on the standard library side (as you can't change the object
layout without breaking the linkability).

Number 1-3 are all loud errors and fairly easy to correct. 2 would benefit
from some error message improvement by the IDE when it sees the linker
error though.

5 should be very rare, but on the other hand it is a silent error. Then
again this seems to be more likely to reveal pre-existing bugs than to
introduce new ones as it is usually erroneous to implement the same
function in multiple places. (The most common situation is probably that
the functions are identical leftovers from some copy-paste operation
anyway).

At this point I have not dug down into the rule updates that would be
necessary when doing overload resolution for call sites with named
parameters but I think it has been done before.

To sum up I am very skeptical to introducing a new type of names but I
would be interested in a fresh look at named parameters. The main
motivation is probably not the constructor case but the general improvement
when calling function with many defaulted parameters, such as prevalent in
GUI libraries and similar.

Can anyone pinpoint a language which sports both function overloading on
type and named parameters at call sites (without help from declarations)?
That would be an interesting source of inspiration rather than Python's
untyped, unoverloadable functions.


> It also starts to look like named arguments, which are a nice feature of
> (for example) python.
>
> I'm wondering how you think this looks:
>
> void test()
> {
>   auto p = geometry::point{.polar={.angle=1.4, .length=6.0}};
> }
>
> Given that this has already been defined:
>
> namespace geometry {
>
>   struct cartesian
>   {
>     double x, y;
>   };
>
>   struct angle {
>     angle(double rads);
>     double rads_;
>   };
>
>   struct length {
>     angle(double len);
>     double len_;
>   };
>
>   struct polar
>   {
>     polar(angle, length);
>     angle a;
>     length r;
>   };
>
>   struct point
>   {
>     point(cartesian);
>     point(polar);
>   };
> }
>
> It's expressive, but is it too much?
>
>
>
>>
>> --
>> 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
>> email to std-proposal...@isocpp.org <javascript:>.
>> To post to this group, send email to std-pr...@isocpp.org <javascript:>.
>> To view this discussion on the web visit
>> https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7%40isocpp.org
>> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7%40isocpp.org?utm_medium=email&utm_source=footer>
>> .
>>
>

--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/d287aba4-4077-4ba7-9c74-74466e421e59%40isocpp.org.

------=_Part_7463_1987529786.1532213381402
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">I think you are mixing up type and parameter names. I assu=
me that you mean that .polar at the call site is a type name, but this is c=
ontrary to the C named initializers which are member names (or here that wo=
uld presumably mean parameter names).<div><br></div><div>The possibility of=
 defining separate polar and cartesian types has already been mentioned and=
 dismissed, so .polar at the call site must mean a parameter name, which me=
ans that you have to reformulate your geometry namespace contents. I think =
that this is the way to go, as the tag colon syntax is very novel and as th=
e declaration has to prepare for call sites to be able to use the feature.<=
/div><div><br></div><div>Proposing being able to use parameter names at cal=
l sites comes with the mandatory objection that different declarations of t=
he same function signature may specify different parameter names. Currently=
 this has no effect other than confusion on the part of the human reader. T=
o make the example work it must be possible to overload on parameter names,=
 which means that two different declarations declare different functions wi=
th the same set of types for their parameters. For old code that uses diffe=
rent names we get different types of errors with the new definion:</div><di=
v><br></div><div>1. For methods being implemented out of line we get an err=
or that the method is not declared in the class head.</div><div><br></div><=
div>2. For free functions we get two separate functions which can lead to u=
nresolved external errors from the linker.</div><div><br></div><div>3. Old =
call sites which have seen two type-equal declarations with different param=
eter names and which do not mention any parameter names (i.e. all old call =
sites) an ambiguous call error will result.</div><div><br></div><div>4. The=
 mangled names will definitely be changed which is an ABI breakage.</div><d=
iv><br></div><div>5. If the same function declaration has implementation in=
 both a direct linked object file (with other parameter names than declarat=
ion) and a library (with same parameter names as declaration). Currently th=
is selects the implementation from the object file and does not use the fun=
ction in the library during linking, while in the future the implementation=
 from the library will be used (as its mangled name matches).</div><div><br=
></div><div>Out of these I would be most concerned about 4, as there seems =
to be a strong wish to not break ABI compatibility. At some point, maybe fo=
r C++23, an ABI update may be desired as the backwards compatibility restra=
ins development on the standard library side (as you can&#39;t change the o=
bject layout without breaking the linkability).</div><div><br></div><div>Nu=
mber 1-3 are all loud errors and fairly easy to correct. 2 would benefit fr=
om some error message improvement by the IDE when it sees the linker error =
though.</div><div><br></div><div>5 should be very rare, but on the other ha=
nd it is a silent error. Then again this seems to be more likely to reveal =
pre-existing bugs than to introduce new ones as it is usually erroneous to =
implement the same function in multiple places. (The most common situation =
is probably that the functions are identical leftovers from some copy-paste=
 operation anyway).</div><div><br></div><div>At this point I have not dug d=
own into the rule updates that would be necessary when doing overload resol=
ution for call sites with named parameters but I think it has been done bef=
ore.</div><div><br></div><div>To sum up I am very skeptical to introducing =
a new type of names but I would be interested in a fresh look at named para=
meters. The main motivation is probably not the constructor case but the ge=
neral improvement when calling function with many defaulted parameters, suc=
h as prevalent in GUI libraries and similar.</div><div><br></div><div>Can a=
nyone pinpoint a language which sports both function overloading on type an=
d named parameters at call sites (without help from declarations)? That wou=
ld be an interesting source of inspiration rather than Python&#39;s untyped=
, unoverloadable functions.</div><div><br><blockquote class=3D"gmail_quote"=
 style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-=
left: 1ex;"><div dir=3D"ltr"><div class=3D"gmail_quote"><div><br></div><div=
>It also starts to look like named arguments, which are a nice feature of (=
for example) python.</div><div><br></div><div>I&#39;m wondering how you thi=
nk this looks:</div><div><br></div><div><div style=3D"font-size:small;backg=
round-color:rgb(255,255,255)"><font face=3D"monospace, monospace">void test=
()</font></div><div style=3D"font-size:small;background-color:rgb(255,255,2=
55)"><font face=3D"monospace, monospace">{</font></div><div style=3D"font-s=
ize:small;background-color:rgb(255,255,255)"><font face=3D"monospace, monos=
pace">=C2=A0 auto p =3D geometry::point{.polar=3D{.<wbr>angle=3D1.4, .lengt=
h=3D6.0}};</font></div><div style=3D"font-size:small;background-color:rgb(2=
55,255,255)"><font face=3D"monospace, monospace">}</font></div><div style=
=3D"font-size:small;background-color:rgb(255,255,255)"><br></div><div style=
=3D"font-size:small;background-color:rgb(255,255,255)">Given that this has =
already been defined:</div><div style=3D"font-size:small;background-color:r=
gb(255,255,255)"><br></div><div style=3D"font-size:small;background-color:r=
gb(255,255,255)"><span style=3D"font-family:monospace,monospace">namespace =
geometry {=C2=A0</span><br></div></div><div><font face=3D"monospace, monosp=
ace"><br></font></div><div><font face=3D"monospace, monospace">=C2=A0 struc=
t cartesian</font></div><div><font face=3D"monospace, monospace">=C2=A0 {</=
font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 double x,=
 y;</font></div><div><font face=3D"monospace, monospace">=C2=A0 };</font></=
div><div><font face=3D"monospace, monospace"><br></font></div><div><font fa=
ce=3D"monospace, monospace">=C2=A0 struct angle {</font></div><div><font fa=
ce=3D"monospace, monospace">=C2=A0 =C2=A0 angle(double rads);</font></div><=
div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 double rads_;</font><=
/div><div><font face=3D"monospace, monospace">=C2=A0 };</font></div><div><f=
ont face=3D"monospace, monospace"><br></font></div><div><div style=3D"font-=
size:small;background-color:rgb(255,255,255)"><font face=3D"monospace, mono=
space">=C2=A0 struct length {</font></div><div style=3D"font-size:small;bac=
kground-color:rgb(255,255,255)"><font face=3D"monospace, monospace">=C2=A0 =
=C2=A0 angle(double len);</font></div><div style=3D"font-size:small;backgro=
und-color:rgb(255,255,255)"><font face=3D"monospace, monospace">=C2=A0 =C2=
=A0 double len_;</font></div><div style=3D"font-size:small;background-color=
:rgb(255,255,255)"><font face=3D"monospace, monospace">=C2=A0 };</font></di=
v><font face=3D"monospace, monospace"><br>=C2=A0 struct polar<br></font></d=
iv><div><div style=3D"font-size:small;background-color:rgb(255,255,255)"><f=
ont face=3D"monospace, monospace">=C2=A0 {</font></div><div style=3D"font-s=
ize:small;background-color:rgb(255,255,255)"><font face=3D"monospace, monos=
pace">=C2=A0 =C2=A0=C2=A0<span style=3D"font-size:small;background-color:rg=
b(255,255,255);float:none;display:inline">polar(angle, length);</span></fon=
t></div><div style=3D"font-size:small;background-color:rgb(255,255,255)"><d=
iv><font face=3D"monospace, monospace">=C2=A0 =C2=A0 angle a;</font></div><=
div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 length r;</font></div=
><font face=3D"monospace, monospace">=C2=A0 };<br></font></div><font face=
=3D"monospace, monospace"><br></font><span style=3D"font-family:monospace,m=
onospace">=C2=A0 struct point</span><font face=3D"monospace, monospace"><br=
></font></div><div><font face=3D"monospace, monospace">=C2=A0 {</font></div=
><div><div style=3D"font-size:small;background-color:rgb(255,255,255)"><fon=
t face=3D"monospace, monospace">=C2=A0 =C2=A0 point(cartesian);</font></div=
><div style=3D"font-size:small;background-color:rgb(255,255,255)"><font fac=
e=3D"monospace, monospace">=C2=A0 =C2=A0 point(polar);</font></div><font fa=
ce=3D"monospace, monospace">=C2=A0 };<br></font></div><div><font face=3D"mo=
nospace, monospace">}<br></font></div><div><font face=3D"monospace, monospa=
ce"><br></font></div><div><div style=3D"font-size:small;background-color:rg=
b(255,255,255)"><div style=3D"font-size:small;background-color:rgb(255,255,=
255)">It&#39;s expressive, but is it too much?</div></div><br>=C2=A0<br></d=
iv><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left=
:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div><br></di=
v></div>

<p></p>

-- <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"javascript:" target=3D"_blank" gdf-obfuscated-mailto=3D"=
mSJvAouTCwAJ" rel=3D"nofollow" onmousedown=3D"this.href=3D&#39;javascript:&=
#39;;return true;" onclick=3D"this.href=3D&#39;javascript:&#39;;return true=
;">std-proposal...@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"javascript:" target=3D"_bla=
nk" gdf-obfuscated-mailto=3D"mSJvAouTCwAJ" rel=3D"nofollow" onmousedown=3D"=
this.href=3D&#39;javascript:&#39;;return true;" onclick=3D"this.href=3D&#39=
;javascript:&#39;;return true;">std-pr...@isocpp.org</a>.<br>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7%=
40isocpp.org?utm_medium=3Demail&amp;utm_source=3Dfooter" target=3D"_blank" =
rel=3D"nofollow" onmousedown=3D"this.href=3D&#39;https://groups.google.com/=
a/isocpp.org/d/msgid/std-proposals/ff08a552-4ef9-4115-9de2-56850de26da7%40i=
socpp.org?utm_medium\x3demail\x26utm_source\x3dfooter&#39;;return true;" on=
click=3D"this.href=3D&#39;https://groups.google.com/a/isocpp.org/d/msgid/st=
d-proposals/ff08a552-4ef9-4115-9de2-56850de26da7%40isocpp.org?utm_medium\x3=
demail\x26utm_source\x3dfooter&#39;;return true;">https://groups.google.com=
/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/ff08a552-4ef9-4115-<wbr>9de2-=
56850de26da7%40isocpp.org</a><wbr>.<br>
</blockquote></div></div>
</blockquote></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/d287aba4-4077-4ba7-9c74-74466e421e59%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/d287aba4-4077-4ba7-9c74-74466e421e59=
%40isocpp.org</a>.<br />

------=_Part_7463_1987529786.1532213381402--

------=_Part_7462_538636660.1532213381401--

.


Author: Barry Revzin <barry.revzin@gmail.com>
Date: Sun, 22 Jul 2018 05:06:48 -0700 (PDT)
Raw View
------=_Part_7620_1047050099.1532261208882
Content-Type: multipart/alternative;
 boundary="----=_Part_7621_250511335.1532261208882"

------=_Part_7621_250511335.1532261208882
Content-Type: text/plain; charset="UTF-8"



On Saturday, July 21, 2018 at 5:49:41 PM UTC-5, Bengt Gustafsson wrote:
>
> Can anyone pinpoint a language which sports both function overloading on
> type and named parameters at call sites (without help from declarations)?
> That would be an interesting source of inspiration rather than Python's
> untyped, unoverloadable functions.
>

As far as I'm aware, this is valid Swift (it's not *good* swift, just
*valid* Swift):

func add(a: Int, to b: Int) -> Int {
    return a + b
}

func add(a: Int, and b: Int) -> Int {
    return a * b
}

let answer1 = add(2, to: 4)    // 6
let answer2 = add(2, and: 4)   // 8




--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/d90aff4e-3650-4b87-96b3-2671f9fa601e%40isocpp.org.

------=_Part_7621_250511335.1532261208882
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Saturday, July 21, 2018 at 5:49:41 PM UTC-5, Be=
ngt Gustafsson wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=
=3D"ltr"><div>Can anyone pinpoint a language which sports both function ove=
rloading on type and named parameters at call sites (without help from decl=
arations)? That would be an interesting source of inspiration rather than P=
ython&#39;s untyped, unoverloadable functions.</div></div></blockquote><div=
><br></div><div>As far as I&#39;m aware, this is valid Swift (it&#39;s not =
<i>good</i>=C2=A0swift, just <i>valid</i>=C2=A0Swift):</div><div><br></div>=
<div><div class=3D"prettyprint" style=3D"background-color: rgb(250, 250, 25=
0); border-color: rgb(187, 187, 187); border-style: solid; border-width: 1p=
x; word-wrap: break-word;"><code class=3D"prettyprint"><div class=3D"subpre=
ttyprint"><pre class=3D"lang-swift prettyprint prettyprinted" style=3D"padd=
ing: 5px; font-variant-numeric: inherit; font-variant-east-asian: inherit; =
font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, =
Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;Deja=
Vu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New=
&quot;, monospace, sans-serif; vertical-align: baseline; box-sizing: inheri=
t; width: auto; max-height: 600px; overflow: auto; background-color: rgb(23=
9, 240, 241); word-wrap: normal;"><code style=3D"font-style: inherit; font-=
variant: inherit; font-weight: inherit; font-stretch: inherit; line-height:=
 inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;,=
 &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream=
 Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; vert=
ical-align: baseline; box-sizing: inherit; white-space: inherit;"><span sty=
le=3D"color: #000;" class=3D"styled-by-prettify">func add</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify">a</span><span style=3D"color: #660;" =
class=3D"styled-by-prettify">:</span><span style=3D"color: #000;" class=3D"=
styled-by-prettify"> </span><span style=3D"color: #606;" class=3D"styled-by=
-prettify">Int</span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">,</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> to b=
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">:</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #606;" class=3D"styled-by-prettify">Int</span><span style=3D"col=
or: #660;" class=3D"styled-by-prettify">)</span><span style=3D"color: #000;=
" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">-&gt;</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"> </span><span style=3D"color: #606;" class=3D"styled-by-=
prettify">Int</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">{</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 =C2=
=A0 </span><span style=3D"color: #008;" class=3D"styled-by-prettify">return=
</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> a </span>=
<span style=3D"color: #660;" class=3D"styled-by-prettify">+</span><span sty=
le=3D"color: #000;" class=3D"styled-by-prettify"> b<br></span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">}</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br><br>func add</span><span style=3D=
"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #=
000;" class=3D"styled-by-prettify">a</span><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">:</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> </span><span style=3D"color: #606;" class=3D"styled-by-pr=
ettify">Int</span><span style=3D"color: #660;" class=3D"styled-by-prettify"=
>,</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span>=
<span style=3D"color: #008;" class=3D"styled-by-prettify">and</span><span s=
tyle=3D"color: #000;" class=3D"styled-by-prettify"> b</span><span style=3D"=
color: #660;" class=3D"styled-by-prettify">:</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"> </span><span style=3D"color: #606;" clas=
s=3D"styled-by-prettify">Int</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">)</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
-&gt;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </sp=
an><span style=3D"color: #606;" class=3D"styled-by-prettify">Int</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">{</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br>=C2=A0 =C2=A0 </span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">return</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"> a </span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">*</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify"> b<br></span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">}</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify"><br><br>let answer1 </span><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> add</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">(</span><font color=3D"#006666"><span style=3D"color: #066;" cl=
ass=3D"styled-by-prettify">2</span></font><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">,</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"> to</span><span style=3D"color: #660;" class=3D"styled-by-p=
rettify">:</span><span style=3D"color: #000;" class=3D"styled-by-prettify">=
 </span><font color=3D"#006666"><span style=3D"color: #066;" class=3D"style=
d-by-prettify">4</span></font><span style=3D"color: #660;" class=3D"styled-=
by-prettify">)</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"> =C2=A0 =C2=A0</span><span style=3D"color: #800;" class=3D"styled-by-pr=
ettify">// 6</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
"><br>let answer2 </span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
> add</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</sp=
an><font color=3D"#006666"><span style=3D"color: #066;" class=3D"styled-by-=
prettify">2</span></font><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">,</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> =
</span><span style=3D"color: #008;" class=3D"styled-by-prettify">and</span>=
<span style=3D"color: #660;" class=3D"styled-by-prettify">:</span><span sty=
le=3D"color: #000;" class=3D"styled-by-prettify"> </span><font color=3D"#00=
6666"><span style=3D"color: #066;" class=3D"styled-by-prettify">4</span></f=
ont><span style=3D"color: #660;" class=3D"styled-by-prettify">)</span><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"> =C2=A0 </span><span s=
tyle=3D"color: #800;" class=3D"styled-by-prettify">// 8</span></code></pre>=
</div></code></div><br>=C2=A0</div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/d90aff4e-3650-4b87-96b3-2671f9fa601e%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/d90aff4e-3650-4b87-96b3-2671f9fa601e=
%40isocpp.org</a>.<br />

------=_Part_7621_250511335.1532261208882--

------=_Part_7620_1047050099.1532261208882--

.


Author: mihailnajdenov@gmail.com
Date: Thu, 2 Aug 2018 08:23:06 -0700 (PDT)
Raw View
------=_Part_276_1194583652.1533223386267
Content-Type: multipart/alternative;
 boundary="----=_Part_277_691418504.1533223386269"

------=_Part_277_691418504.1533223386269
Content-Type: text/plain; charset="UTF-8"

*Quote
from https://groups.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/czTCvTkSDQAJ
<https://groups.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/czTCvTkSDQAJ>*


> I was thinking about this one:
> https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I
>
> So let me tell you what I was thinking:
>
> There exist a common, yet unutterable, where tag types live (lets call it
> tag_ns to simplify).
>
> When you declare a function with tags:
> int foo(tag_name: float f);
> The compiler creates a tag type in this namespace called tag_name, and
> transform the declaration like that:
> int foo(tag_ns::tag_name, float f);
>
> When you call a function with a tag:
> foo(tag_name: 1.f);
> The compiler creates a tag type in this namespace called tag_name,
> replaces the expression with a call like that (without even needing to know
> the declaration of the function):
> foo(tag_ns::tag_name{}, 1.f);
>
> If two functions (even in different namespaces) use the same tag name,
> they will have the same tag type, which is fine.
>

Yes, initially I was thinking names are names no matter the namespace, but
I abandoned this.

I abandoned it because tags are types, and are used for overload
resolution. If the std has a tag named 'par' and I want to use this name
but with different implementation, I must be able to do that, much like
today
We need namespaces for tags, and,  to the very least labels should be
defined in the namespace of the functions.

But then I also abended automatic introduction...


> ...
>
> The main feature here would be the automatic introduction of types. A bit
> like a template instantiation. It is implicit.
>

Automatic introduction is not that good of a barging - we invent new rules
to save some typing, but new problems arise.

Where are tags created? How can we make them template? How can we add
attributes to them? Is this really new signature?

*Sidenote*, how do you name the type to create a function signature?
decltype(name:)? name: to mean different things in different contexts?
Things escalate quickly.

In the end, I made it all as conservative as possible and as much based on
current practice as possible. The initial simplicity was deceiving, because
it was just a morning idea.

This is not to say we could not use some shortcut syntax.

We could

int foo(tag_name: float f);

generate

case struct tag_name; //< enclosing scope
int foo(case tag_name, float f);

But I still question the pros/cons ratio.




> In your first proposal, you mentioned you wanted to be able to do
> something like that:
> any(in_place<string>: "");
> I don't think it is useful. you are not naming an argument here.
>

In *most* cases tags are used it is not as if the argument is named.

Here it says "*string arguments here:*" and for that colon is grammatically
correct.


Also not naming an argument, but still grammatically correct:

shared_lock( defer_lock: mtx);
shared_lock( try_to_lock: mtx);
shared_lock( adopt_lock: mtx);

As in "...*the lock of: [the mutex]*"


> Now, to be fair, you could do something equivalent in C++20:
> int foo(std::tag<"tag_name">, float f);
>
> foo("tag_name"tag, 1.f);
>
> But the shorthand syntax would be very nice.
> Moreover, such a shorthand syntax would give people incentives to use it
> (I consider it a good thing).
> Let's make a quick poll. Which one do you prefer? (try to see it as a
> newcomer to the language)
> std::find_if(v.begin(), v.end(), functor);
> std::find(v.begin(), v.end(), "if"tag, functor);
> std::find(v.begin(), v.end(), if: functor);
>
> I personally prefer the third one (I would like it even more with ranges).
> This is not really about the possibility to do it now, but how the syntax
> looks.
>
> Overall I want to clarify: that's my opinion, and I'm pretty sure some
> will disagree, but I really think it is worth pursuing.
>

--
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 email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/845a4efd-e98e-4329-a934-8d4d358f3ec0%40isocpp.org.

------=_Part_277_691418504.1533223386269
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div><b>Quote from=C2=A0<a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/czTCvTkSDQAJ">https://group=
s.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/czTCvTkSDQAJ</a><=
/b></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin=
: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 20=
4); border-left-width: 1px; border-left-style: solid;"><div style=3D"backgr=
ound-color: transparent; border-bottom-color: rgb(34, 34, 34); border-botto=
m-style: none; border-bottom-width: 0px; border-image-outset: 0; border-ima=
ge-repeat: stretch; border-image-slice: 100%; border-image-source: none; bo=
rder-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style:=
 none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-=
right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 3=
4); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); =
font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-s=
erif; font-size: 13px; font-style: normal; font-variant: normal; font-weigh=
t: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margi=
n-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decora=
tion: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-wid=
th: 0px; white-space: normal; word-spacing: 0px;">I was thinking about this=
 one: <a style=3D"border-bottom-color: rgb(17, 85, 204); border-bottom-styl=
e: none; border-bottom-width: 0px; border-image-outset: 0; border-image-rep=
eat: stretch; border-image-slice: 100%; border-image-source: none; border-i=
mage-width: 1; border-left-color: rgb(17, 85, 204); border-left-style: none=
; border-left-width: 0px; border-right-color: rgb(17, 85, 204); border-righ=
t-style: none; border-right-width: 0px; border-top-color: rgb(17, 85, 204);=
 border-top-style: none; border-top-width: 0px; color: rgb(17, 85, 204); cu=
rsor: pointer; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; mar=
gin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; p=
adding-top: 0px; text-decoration: none;" onmousedown=3D"this.href=3D&#39;ht=
tps://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4=
I&#39;;return true;" onclick=3D"this.href=3D&#39;https://groups.google.com/=
a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I&#39;;return true;" hre=
f=3D"https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6r=
LutWGp4I" target=3D"_blank" rel=3D"nofollow">https://groups.google.com/a/<w=
br style=3D"border-bottom-color: rgb(17, 85, 204); border-bottom-style: non=
e; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: s=
tretch; border-image-slice: 100%; border-image-source: none; border-image-w=
idth: 1; border-left-color: rgb(17, 85, 204); border-left-style: none; bord=
er-left-width: 0px; border-right-color: rgb(17, 85, 204); border-right-styl=
e: none; border-right-width: 0px; border-top-color: rgb(17, 85, 204); borde=
r-top-style: none; border-top-width: 0px; color: rgb(17, 85, 204); cursor: =
pointer; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-to=
p: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px; text-decoration: none;">isocpp.org/forum/#!topic/std-<wbr style=
=3D"border-bottom-color: rgb(17, 85, 204); border-bottom-style: none; borde=
r-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; =
border-image-slice: 100%; border-image-source: none; border-image-width: 1;=
 border-left-color: rgb(17, 85, 204); border-left-style: none; border-left-=
width: 0px; border-right-color: rgb(17, 85, 204); border-right-style: none;=
 border-right-width: 0px; border-top-color: rgb(17, 85, 204); border-top-st=
yle: none; border-top-width: 0px; color: rgb(17, 85, 204); cursor: pointer;=
 margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; =
padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0p=
x; text-decoration: none;">proposals/O6rLutWGp4I</a> <br style=3D"border-bo=
ttom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width=
: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-s=
lice: 100%; border-image-source: none; border-image-width: 1; border-left-c=
olor: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bor=
der-right-color: rgb(34, 34, 34); border-right-style: none; border-right-wi=
dth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border=
-top-width: 0px; color: rgb(34, 34, 34); line-height: normal; margin-bottom=
: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom=
: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></div><div=
 style=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 3=
4); border-bottom-style: none; border-bottom-width: 0px; border-image-outse=
t: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-=
source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bo=
rder-left-style: none; border-left-width: 0px; border-right-color: rgb(34, =
34, 34); border-right-style: none; border-right-width: 0px; border-top-colo=
r: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: r=
gb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&=
amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: no=
rmal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-=
left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: =
0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: l=
eft; text-decoration: none; text-indent: 0px; text-transform: none; -webkit=
-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><br style=
=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border=
-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; b=
order-image-slice: 100%; border-image-source: none; border-image-width: 1; =
border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bo=
rder-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style:=
 none; border-top-width: 0px; color: rgb(34, 34, 34); line-height: normal; =
margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
;"></div><div style=3D"background-color: transparent; border-bottom-color: =
rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; borde=
r-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; =
border-image-source: none; border-image-width: 1; border-left-color: rgb(34=
, 34, 34); border-left-style: none; border-left-width: 0px; border-right-co=
lor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bo=
rder-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: =
0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;qu=
ot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; fon=
t-variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom:=
 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; =
text-align: left; text-decoration: none; text-indent: 0px; text-transform: =
none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0p=
x;">So let me tell you what I was thinking:</div><div style=3D"background-c=
olor: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-styl=
e: none; border-bottom-width: 0px; border-image-outset: 0; border-image-rep=
eat: stretch; border-image-slice: 100%; border-image-source: none; border-i=
mage-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none;=
 border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-=
style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bo=
rder-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-f=
amily: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; =
font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400=
; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-righ=
t: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px=
; padding-right: 0px; padding-top: 0px; text-align: left; text-decoration: =
none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0p=
x; white-space: normal; word-spacing: 0px;"><br style=3D"border-bottom-colo=
r: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bo=
rder-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100=
%; border-image-source: none; border-image-width: 1; border-left-color: rgb=
(34, 34, 34); border-left-style: none; border-left-width: 0px; border-right=
-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px;=
 border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-widt=
h: 0px; color: rgb(34, 34, 34); line-height: normal; margin-bottom: 0px; ma=
rgin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pa=
dding-left: 0px; padding-right: 0px; padding-top: 0px;"></div><div style=3D=
"background-color: transparent; border-bottom-color: rgb(34, 34, 34); borde=
r-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bor=
der-image-repeat: stretch; border-image-slice: 100%; border-image-source: n=
one; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left=
-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(34=
, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34=
, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;=
,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; fon=
t-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px=
; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padd=
ing-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text=
-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-str=
oke-width: 0px; white-space: normal; word-spacing: 0px;">There exist a comm=
on, yet unutterable, where tag types live (lets call it tag_ns to simplify)=
..</div><div style=3D"background-color: transparent; border-bottom-color: rg=
b(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-=
image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bo=
rder-image-source: none; border-image-width: 1; border-left-color: rgb(34, =
34, 34); border-left-style: none; border-left-width: 0px; border-right-colo=
r: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bord=
er-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0p=
x; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot=
;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-=
variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0=
px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; paddi=
ng-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; te=
xt-align: left; text-decoration: none; text-indent: 0px; text-transform: no=
ne; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;=
"><br style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: n=
one; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat:=
 stretch; border-image-slice: 100%; border-image-source: none; border-image=
-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bor=
der-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-styl=
e: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border=
-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); line-heigh=
t: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-=
top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddi=
ng-top: 0px;"></div><div style=3D"background-color: transparent; border-bot=
tom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width:=
 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sl=
ice: 100%; border-image-source: none; border-image-width: 1; border-left-co=
lor: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bord=
er-right-color: rgb(34, 34, 34); border-right-style: none; border-right-wid=
th: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-=
top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;qu=
ot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: =
normal; font-variant: normal; font-weight: 400; letter-spacing: normal; mar=
gin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orph=
ans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; text-=
transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-=
spacing: 0px;">When you declare a function with tags:</div><div style=3D"ba=
ckground-color: transparent; border-bottom-color: rgb(34, 34, 34); border-b=
ottom-style: none; border-bottom-width: 0px; border-image-outset: 0; border=
-image-repeat: stretch; border-image-slice: 100%; border-image-source: none=
; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-st=
yle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bor=
der-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 3=
4, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 3=
4); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sa=
ns-serif; font-size: 13px; font-style: normal; font-variant: normal; font-w=
eight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding=
-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-de=
coration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke=
-width: 0px; white-space: normal; word-spacing: 0px;"><div style=3D"backgro=
und-color: rgb(250, 250, 250); border-bottom-color: rgb(187, 187, 187); bor=
der-bottom-style: solid; border-bottom-width: 1px; border-image-outset: 0; =
border-image-repeat: stretch; border-image-slice: 100%; border-image-source=
: none; border-image-width: 1; border-left-color: rgb(187, 187, 187); borde=
r-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 1=
87, 187); border-right-style: solid; border-right-width: 1px; border-top-co=
lor: rgb(187, 187, 187); border-top-style: solid; border-top-width: 1px; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"=
><code style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bo=
rder-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-sty=
le: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); borde=
r-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: =
0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left:=
 0px; padding-right: 0px; padding-top: 0px;"><div style=3D"border-bottom-co=
lor: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; =
border-image-outset: 0; border-image-repeat: stretch; border-image-slice: 1=
00%; border-image-source: none; border-image-width: 1; border-left-color: r=
gb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-rig=
ht-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0p=
x; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-wi=
dth: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px;"><span style=3D"border-bottom-color: rgb(0, 0, 136); border-bot=
tom-style: none; border-bottom-width: 0px; border-image-outset: 0; border-i=
mage-repeat: stretch; border-image-slice: 100%; border-image-source: none; =
border-image-width: 1; border-left-color: rgb(0, 0, 136); border-left-style=
: none; border-left-width: 0px; border-right-color: rgb(0, 0, 136); border-=
right-style: none; border-right-width: 0px; border-top-color: rgb(0, 0, 136=
); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 136); ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"=
>int</span><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-=
style: none; border-bottom-width: 0px; border-image-outset: 0; border-image=
-repeat: stretch; border-image-slice: 100%; border-image-source: none; bord=
er-image-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none=
; border-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-st=
yle: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-=
top-style: none; border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom:=
 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom:=
 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"> foo</span>=
<span style=3D"border-bottom-color: rgb(102, 102, 0); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(102, 102, 0); border-left-style: none; b=
order-left-width: 0px; border-right-color: rgb(102, 102, 0); border-right-s=
tyle: none; border-right-width: 0px; border-top-color: rgb(102, 102, 0); bo=
rder-top-style: none; border-top-width: 0px; color: rgb(102, 102, 0); margi=
n-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; paddin=
g-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(<=
/span><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style=
: none; border-bottom-width: 0px; border-image-outset: 0; border-image-repe=
at: stretch; border-image-slice: 100%; border-image-source: none; border-im=
age-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; bor=
der-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: =
none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-s=
tyle: none; border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px;=
 margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px;=
 padding-left: 0px; padding-right: 0px; padding-top: 0px;">tag_name</span><=
span style=3D"border-bottom-color: rgb(102, 102, 0); border-bottom-style: n=
one; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat:=
 stretch; border-image-slice: 100%; border-image-source: none; border-image=
-width: 1; border-left-color: rgb(102, 102, 0); border-left-style: none; bo=
rder-left-width: 0px; border-right-color: rgb(102, 102, 0); border-right-st=
yle: none; border-right-width: 0px; border-top-color: rgb(102, 102, 0); bor=
der-top-style: none; border-top-width: 0px; color: rgb(102, 102, 0); margin=
-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding=
-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">:</=
span><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style:=
 none; border-bottom-width: 0px; border-image-outset: 0; border-image-repea=
t: stretch; border-image-slice: 100%; border-image-source: none; border-ima=
ge-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; bord=
er-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: n=
one; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-st=
yle: none; border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; =
margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; =
padding-left: 0px; padding-right: 0px; padding-top: 0px;"> </span><span sty=
le=3D"border-bottom-color: rgb(0, 0, 136); border-bottom-style: none; borde=
r-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; =
border-image-slice: 100%; border-image-source: none; border-image-width: 1;=
 border-left-color: rgb(0, 0, 136); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(0, 0, 136); border-right-style: none; bor=
der-right-width: 0px; border-top-color: rgb(0, 0, 136); border-top-style: n=
one; border-top-width: 0px; color: rgb(0, 0, 136); margin-bottom: 0px; marg=
in-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padd=
ing-left: 0px; padding-right: 0px; padding-top: 0px;">float</span><span sty=
le=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-=
bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bo=
rder-image-slice: 100%; border-image-source: none; border-image-width: 1; b=
order-left-color: rgb(0, 0, 0); border-left-style: none; border-left-width:=
 0px; border-right-color: rgb(0, 0, 0); border-right-style: none; border-ri=
ght-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; bor=
der-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0=
px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: =
0px; padding-right: 0px; padding-top: 0px;"> f</span><span style=3D"border-=
bottom-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-wi=
dth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-imag=
e-slice: 100%; border-image-source: none; border-image-width: 1; border-lef=
t-color: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px;=
 border-right-color: rgb(102, 102, 0); border-right-style: none; border-rig=
ht-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; =
border-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-=
left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding=
-left: 0px; padding-right: 0px; padding-top: 0px;">);</span><span style=3D"=
border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-slice: 100%; border-image-source: none; border-image-width: 1; border-=
left-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; =
border-right-color: rgb(0, 0, 0); border-right-style: none; border-right-wi=
dth: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-to=
p-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; ma=
rgin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; p=
adding-right: 0px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb=
(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-imag=
e-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border=
-image-source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0)=
; border-left-style: none; border-left-width: 0px; border-right-color: rgb(=
0, 0, 0); border-right-style: none; border-right-width: 0px; border-top-col=
or: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; margin-bot=
tom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bot=
tom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></span>=
</div></code></div>The compiler creates a tag type in this namespace called=
 tag_name, and transform the declaration like that:</div><div style=3D"back=
ground-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bot=
tom-style: none; border-bottom-width: 0px; border-image-outset: 0; border-i=
mage-repeat: stretch; border-image-slice: 100%; border-image-source: none; =
border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-styl=
e: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); borde=
r-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34,=
 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34)=
; font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans=
-serif; font-size: 13px; font-style: normal; font-variant: normal; font-wei=
ght: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; mar=
gin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-l=
eft: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-deco=
ration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-w=
idth: 0px; white-space: normal; word-spacing: 0px;"><div style=3D"backgroun=
d-color: rgb(250, 250, 250); border-bottom-color: rgb(187, 187, 187); borde=
r-bottom-style: solid; border-bottom-width: 1px; border-image-outset: 0; bo=
rder-image-repeat: stretch; border-image-slice: 100%; border-image-source: =
none; border-image-width: 1; border-left-color: rgb(187, 187, 187); border-=
left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187=
, 187); border-right-style: solid; border-right-width: 1px; border-top-colo=
r: rgb(187, 187, 187); border-top-style: solid; border-top-width: 1px; marg=
in-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; paddi=
ng-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><=
code style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: no=
ne; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: =
stretch; border-image-slice: 100%; border-image-source: none; border-image-=
width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bord=
er-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style=
: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-=
top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0p=
x; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0=
px; padding-right: 0px; padding-top: 0px;"><div style=3D"border-bottom-colo=
r: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bo=
rder-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100=
%; border-image-source: none; border-image-width: 1; border-left-color: rgb=
(34, 34, 34); border-left-style: none; border-left-width: 0px; border-right=
-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px;=
 border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-widt=
h: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top=
: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-=
top: 0px;"><span style=3D"border-bottom-color: rgb(0, 0, 136); border-botto=
m-style: none; border-bottom-width: 0px; border-image-outset: 0; border-ima=
ge-repeat: stretch; border-image-slice: 100%; border-image-source: none; bo=
rder-image-width: 1; border-left-color: rgb(0, 0, 136); border-left-style: =
none; border-left-width: 0px; border-right-color: rgb(0, 0, 136); border-ri=
ght-style: none; border-right-width: 0px; border-top-color: rgb(0, 0, 136);=
 border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 136); marg=
in-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; paddi=
ng-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">i=
nt</span><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-st=
yle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-r=
epeat: stretch; border-image-slice: 100%; border-image-source: none; border=
-image-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; =
border-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-styl=
e: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-to=
p-style: none; border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0=
px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"> foo</span><s=
pan style=3D"border-bottom-color: rgb(102, 102, 0); border-bottom-style: no=
ne; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: =
stretch; border-image-slice: 100%; border-image-source: none; border-image-=
width: 1; border-left-color: rgb(102, 102, 0); border-left-style: none; bor=
der-left-width: 0px; border-right-color: rgb(102, 102, 0); border-right-sty=
le: none; border-right-width: 0px; border-top-color: rgb(102, 102, 0); bord=
er-top-style: none; border-top-width: 0px; color: rgb(102, 102, 0); margin-=
bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-=
bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</s=
pan><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; borde=
r-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: no=
ne; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-sty=
le: none; border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; m=
argin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; p=
adding-left: 0px; padding-right: 0px; padding-top: 0px;">tag_ns</span><span=
 style=3D"border-bottom-color: rgb(102, 102, 0); border-bottom-style: none;=
 border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: str=
etch; border-image-slice: 100%; border-image-source: none; border-image-wid=
th: 1; border-left-color: rgb(102, 102, 0); border-left-style: none; border=
-left-width: 0px; border-right-color: rgb(102, 102, 0); border-right-style:=
 none; border-right-width: 0px; border-top-color: rgb(102, 102, 0); border-=
top-style: none; border-top-width: 0px; color: rgb(102, 102, 0); margin-bot=
tom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bot=
tom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">::</spa=
n><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: no=
ne; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: =
stretch; border-image-slice: 100%; border-image-source: none; border-image-=
width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; border-=
left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none=
; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style=
: none; border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; mar=
gin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pad=
ding-left: 0px; padding-right: 0px; padding-top: 0px;">tag_name</span><span=
 style=3D"border-bottom-color: rgb(102, 102, 0); border-bottom-style: none;=
 border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: str=
etch; border-image-slice: 100%; border-image-source: none; border-image-wid=
th: 1; border-left-color: rgb(102, 102, 0); border-left-style: none; border=
-left-width: 0px; border-right-color: rgb(102, 102, 0); border-right-style:=
 none; border-right-width: 0px; border-top-color: rgb(102, 102, 0); border-=
top-style: none; border-top-width: 0px; color: rgb(102, 102, 0); margin-bot=
tom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bot=
tom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">,</span=
><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: non=
e; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: s=
tretch; border-image-slice: 100%; border-image-source: none; border-image-w=
idth: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none;=
 border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style:=
 none; border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; marg=
in-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padd=
ing-left: 0px; padding-right: 0px; padding-top: 0px;"> </span><span style=
=3D"border-bottom-color: rgb(0, 0, 136); border-bottom-style: none; border-=
bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bo=
rder-image-slice: 100%; border-image-source: none; border-image-width: 1; b=
order-left-color: rgb(0, 0, 136); border-left-style: none; border-left-widt=
h: 0px; border-right-color: rgb(0, 0, 136); border-right-style: none; borde=
r-right-width: 0px; border-top-color: rgb(0, 0, 136); border-top-style: non=
e; border-top-width: 0px; color: rgb(0, 0, 136); margin-bottom: 0px; margin=
-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddin=
g-left: 0px; padding-right: 0px; padding-top: 0px;">float</span><span style=
=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bo=
ttom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bord=
er-image-slice: 100%; border-image-source: none; border-image-width: 1; bor=
der-left-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0=
px; border-right-color: rgb(0, 0, 0); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; borde=
r-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px=
; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0p=
x; padding-right: 0px; padding-top: 0px;"> f</span><span style=3D"border-bo=
ttom-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-widt=
h: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-=
slice: 100%; border-image-source: none; border-image-width: 1; border-left-=
color: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; b=
order-right-color: rgb(102, 102, 0); border-right-style: none; border-right=
-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; bo=
rder-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-le=
ft: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-l=
eft: 0px; padding-right: 0px; padding-top: 0px;">);</span><span style=3D"bo=
rder-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-w=
idth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-ima=
ge-slice: 100%; border-image-source: none; border-image-width: 1; border-le=
ft-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(0, 0, 0); border-right-style: none; border-right-widt=
h: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-=
width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb(0=
, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-image-=
outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-i=
mage-source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); =
border-left-style: none; border-left-width: 0px; border-right-color: rgb(0,=
 0, 0); border-right-style: none; border-right-width: 0px; border-top-color=
: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; margin-botto=
m: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></span></=
div></code></div></div><div style=3D"background-color: transparent; border-=
bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-wid=
th: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image=
-slice: 100%; border-image-source: none; border-image-width: 1; border-left=
-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; b=
order-right-color: rgb(34, 34, 34); border-right-style: none; border-right-=
width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bord=
er-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp=
;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-styl=
e: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; =
margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; o=
rphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; te=
xt-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; wo=
rd-spacing: 0px;"><br style=3D"border-bottom-color: rgb(34, 34, 34); border=
-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bord=
er-image-repeat: stretch; border-image-slice: 100%; border-image-source: no=
ne; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); b=
order-right-style: none; border-right-width: 0px; border-top-color: rgb(34,=
 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34,=
 34); line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-rig=
ht: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-r=
ight: 0px; padding-top: 0px;"></div><div style=3D"background-color: transpa=
rent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bord=
er-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch;=
 border-image-slice: 100%; border-image-source: none; border-image-width: 1=
; border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-=
width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; =
border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-styl=
e: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;q=
uot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13=
px; font-style: normal; font-variant: normal; font-weight: 400; letter-spac=
ing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margi=
n-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-rig=
ht: 0px; padding-top: 0px; text-align: left; text-decoration: none; text-in=
dent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-spac=
e: normal; word-spacing: 0px;">When you call a function with a tag:</div><d=
iv style=3D"background-color: transparent; border-bottom-color: rgb(34, 34,=
 34); border-bottom-style: none; border-bottom-width: 0px; border-image-out=
set: 0; border-image-repeat: stretch; border-image-slice: 100%; border-imag=
e-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); =
border-left-style: none; border-left-width: 0px; border-right-color: rgb(34=
, 34, 34); border-right-style: none; border-right-width: 0px; border-top-co=
lor: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color:=
 rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetic=
a&amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: =
normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margi=
n-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom=
: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align:=
 left; text-decoration: none; text-indent: 0px; text-transform: none; -webk=
it-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><div st=
yle=3D"background-color: rgb(250, 250, 250); border-bottom-color: rgb(187, =
187, 187); border-bottom-style: solid; border-bottom-width: 1px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(187, 18=
7, 187); border-left-style: solid; border-left-width: 1px; border-right-col=
or: rgb(187, 187, 187); border-right-style: solid; border-right-width: 1px;=
 border-top-color: rgb(187, 187, 187); border-top-style: solid; border-top-=
width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;"><code style=3D"border-bottom-color: rgb(34, 34, 34); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(34, =
34, 34); border-top-style: none; border-top-width: 0px; margin-bottom: 0px;=
 margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px;=
 padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div style=3D"bo=
rder-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-botto=
m-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-=
image-slice: 100%; border-image-source: none; border-image-width: 1; border=
-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0=
px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-r=
ight-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none;=
 border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right:=
 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px;"><span style=3D"border-bottom-color: rgb(0, 0, 0)=
; border-bottom-style: none; border-bottom-width: 0px; border-image-outset:=
 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-so=
urce: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-=
left-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0);=
 border-right-style: none; border-right-width: 0px; border-top-color: rgb(0=
, 0, 0); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0)=
; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;=
 padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0=
px;">foo</span><span style=3D"border-bottom-color: rgb(102, 102, 0); border=
-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bord=
er-image-repeat: stretch; border-image-slice: 100%; border-image-source: no=
ne; border-image-width: 1; border-left-color: rgb(102, 102, 0); border-left=
-style: none; border-left-width: 0px; border-right-color: rgb(102, 102, 0);=
 border-right-style: none; border-right-width: 0px; border-top-color: rgb(1=
02, 102, 0); border-top-style: none; border-top-width: 0px; color: rgb(102,=
 102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px;">(</span><span style=3D"border-bottom-color: rgb(0, 0, 0); bord=
er-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bo=
rder-image-repeat: stretch; border-image-slice: 100%; border-image-source: =
none; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0); borde=
r-right-style: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0=
); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0); marg=
in-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; paddi=
ng-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">t=
ag_name</span><span style=3D"border-bottom-color: rgb(102, 102, 0); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(102, 102, 0); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(102, 102, 0); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(10=
2, 102, 0); border-top-style: none; border-top-width: 0px; color: rgb(102, =
102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-to=
p: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px;">:</span><span style=3D"border-bottom-color: rgb(0, 0, 0); borde=
r-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bor=
der-image-repeat: stretch; border-image-slice: 100%; border-image-source: n=
one; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-left-st=
yle: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0); border=
-right-style: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0)=
; border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0); margi=
n-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; paddin=
g-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"> <=
/span><span style=3D"border-bottom-color: rgb(0, 102, 102); border-bottom-s=
tyle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-=
repeat: stretch; border-image-slice: 100%; border-image-source: none; borde=
r-image-width: 1; border-left-color: rgb(0, 102, 102); border-left-style: n=
one; border-left-width: 0px; border-right-color: rgb(0, 102, 102); border-r=
ight-style: none; border-right-width: 0px; border-top-color: rgb(0, 102, 10=
2); border-top-style: none; border-top-width: 0px; color: rgb(0, 102, 102);=
 margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; =
padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0p=
x;">1.f</span><span style=3D"border-bottom-color: rgb(102, 102, 0); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(102, 102, 0); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(102, 102, 0); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(10=
2, 102, 0); border-top-style: none; border-top-width: 0px; color: rgb(102, =
102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-to=
p: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px;">);</span><span style=3D"border-bottom-color: rgb(0, 0, 0); bord=
er-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bo=
rder-image-repeat: stretch; border-image-slice: 100%; border-image-source: =
none; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0); borde=
r-right-style: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0=
); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0); marg=
in-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; paddi=
ng-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><=
br style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; b=
order-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stret=
ch; border-image-slice: 100%; border-image-source: none; border-image-width=
: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; border-left-=
width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none; bor=
der-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: non=
e; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-righ=
t: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-ri=
ght: 0px; padding-top: 0px;"></span></div></code></div></div><div style=3D"=
background-color: transparent; border-bottom-color: rgb(34, 34, 34); border=
-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bord=
er-image-repeat: stretch; border-image-slice: 100%; border-image-source: no=
ne; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); b=
order-right-style: none; border-right-width: 0px; border-top-color: rgb(34,=
 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34,=
 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,=
sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font=
-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px;=
 margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; paddi=
ng-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-=
decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stro=
ke-width: 0px; white-space: normal; word-spacing: 0px;">The
 compiler creates a tag type in this namespace called tag_name, replaces
 the expression with a call like that (without even needing to know the=20
declaration of the function):</div><div style=3D"background-color: transpar=
ent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; borde=
r-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; =
border-image-slice: 100%; border-image-source: none; border-image-width: 1;=
 border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-w=
idth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; b=
order-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style=
: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp;qu=
ot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13p=
x; font-style: normal; font-variant: normal; font-weight: 400; letter-spaci=
ng: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px; text-align: left; text-decoration: none; text-ind=
ent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space=
: normal; word-spacing: 0px;"><div style=3D"background-color: rgb(250, 250,=
 250); border-bottom-color: rgb(187, 187, 187); border-bottom-style: solid;=
 border-bottom-width: 1px; border-image-outset: 0; border-image-repeat: str=
etch; border-image-slice: 100%; border-image-source: none; border-image-wid=
th: 1; border-left-color: rgb(187, 187, 187); border-left-style: solid; bor=
der-left-width: 1px; border-right-color: rgb(187, 187, 187); border-right-s=
tyle: solid; border-right-width: 1px; border-top-color: rgb(187, 187, 187);=
 border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin=
-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddin=
g-left: 0px; padding-right: 0px; padding-top: 0px;"><code style=3D"border-b=
ottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-widt=
h: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-=
slice: 100%; border-image-source: none; border-image-width: 1; border-left-=
color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(34, 34, 34); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; borde=
r-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; =
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px=
; padding-top: 0px;"><div style=3D"border-bottom-color: rgb(34, 34, 34); bo=
rder-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; =
border-image-repeat: stretch; border-image-slice: 100%; border-image-source=
: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-l=
eft-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom:=
 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom:=
 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style=
=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bo=
ttom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bord=
er-image-slice: 100%; border-image-source: none; border-image-width: 1; bor=
der-left-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0=
px; border-right-color: rgb(0, 0, 0); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; borde=
r-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px=
; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0p=
x; padding-right: 0px; padding-top: 0px;">foo</span><span style=3D"border-b=
ottom-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-wid=
th: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image=
-slice: 100%; border-image-source: none; border-image-width: 1; border-left=
-color: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; =
border-right-color: rgb(102, 102, 0); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; b=
order-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-l=
eft: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-=
left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span style=3D"bo=
rder-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-w=
idth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-ima=
ge-slice: 100%; border-image-source: none; border-image-width: 1; border-le=
ft-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(0, 0, 0); border-right-style: none; border-right-widt=
h: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-=
width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px;">tag_ns</span><span style=3D"border-bott=
om-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-width:=
 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sl=
ice: 100%; border-image-source: none; border-image-width: 1; border-left-co=
lor: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; bor=
der-right-color: rgb(102, 102, 0); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; bord=
er-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left=
: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px;">::</span><span style=3D"bord=
er-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-wid=
th: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image=
-slice: 100%; border-image-source: none; border-image-width: 1; border-left=
-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; bord=
er-right-color: rgb(0, 0, 0); border-right-style: none; border-right-width:=
 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-wi=
dth: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin=
-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px;">tag_name</span><span style=3D"border-bott=
om-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-width:=
 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sl=
ice: 100%; border-image-source: none; border-image-width: 1; border-left-co=
lor: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; bor=
der-right-color: rgb(102, 102, 0); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; bord=
er-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left=
: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px;">{},</span><span style=3D"bor=
der-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-wi=
dth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-imag=
e-slice: 100%; border-image-source: none; border-image-width: 1; border-lef=
t-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; bor=
der-right-color: rgb(0, 0, 0); border-right-style: none; border-right-width=
: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-w=
idth: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margi=
n-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padd=
ing-right: 0px; padding-top: 0px;"> </span><span style=3D"border-bottom-col=
or: rgb(0, 102, 102); border-bottom-style: none; border-bottom-width: 0px; =
border-image-outset: 0; border-image-repeat: stretch; border-image-slice: 1=
00%; border-image-source: none; border-image-width: 1; border-left-color: r=
gb(0, 102, 102); border-left-style: none; border-left-width: 0px; border-ri=
ght-color: rgb(0, 102, 102); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(0, 102, 102); border-top-style: none; border-top=
-width: 0px; color: rgb(0, 102, 102); margin-bottom: 0px; margin-left: 0px;=
 margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px=
; padding-right: 0px; padding-top: 0px;">1.f</span><span style=3D"border-bo=
ttom-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-widt=
h: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-=
slice: 100%; border-image-source: none; border-image-width: 1; border-left-=
color: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; b=
order-right-color: rgb(102, 102, 0); border-right-style: none; border-right=
-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; bo=
rder-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-le=
ft: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-l=
eft: 0px; padding-right: 0px; padding-top: 0px;">);</span><span style=3D"bo=
rder-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-w=
idth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-ima=
ge-slice: 100%; border-image-source: none; border-image-width: 1; border-le=
ft-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(0, 0, 0); border-right-style: none; border-right-widt=
h: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-=
width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb(0=
, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-image-=
outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-i=
mage-source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); =
border-left-style: none; border-left-width: 0px; border-right-color: rgb(0,=
 0, 0); border-right-style: none; border-right-width: 0px; border-top-color=
: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; margin-botto=
m: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></span></=
div></code></div><br style=3D"border-bottom-color: rgb(34, 34, 34); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(34, =
34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, =
34); line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-righ=
t: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-ri=
ght: 0px; padding-top: 0px;">If two functions (even in different namespaces=
) use the same tag name, they will have the same tag type, which is fine.</=
div></blockquote><div><br></div><div>Yes, initially I was thinking names ar=
e names no matter the namespace, but I <span style=3D"display: inline !impo=
rtant; float: none; background-color: transparent; color: rgb(34, 34, 34); =
font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-size:=
 13px; font-style: normal; font-variant: normal; font-weight: 400; letter-s=
pacing: normal; orphans: 2; text-align: left; text-decoration: none; text-i=
ndent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-spa=
ce: normal; word-spacing: 0px;">abandoned </span>this.</div><div><br></div>=
<div>I abandoned it because tags are types, and are used for overload resol=
ution. If the std has a tag named &#39;par&#39; and I want to use this name=
 but with different implementation, I must be able to do that, much like to=
day</div><div>We need namespaces for tags, and,=C2=A0 to the very least lab=
els should be defined in the namespace of the functions.</div><div><br></di=
v><div>But then I also abended automatic introduction...<br></div><div>=C2=
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8=
ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-w=
idth: 1px; border-left-style: solid;"><div style=3D"background-color: trans=
parent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bo=
rder-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretc=
h; border-image-slice: 100%; border-image-source: none; border-image-width:=
 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-lef=
t-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none=
; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-st=
yle: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &amp=
;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: =
13px; font-style: normal; font-variant: normal; font-weight: 400; letter-sp=
acing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; mar=
gin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-r=
ight: 0px; padding-top: 0px; text-align: left; text-decoration: none; text-=
indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-sp=
ace: normal; word-spacing: 0px;">...</div><div style=3D"background-color: t=
ransparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none=
; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: st=
retch; border-image-slice: 100%; border-image-source: none; border-image-wi=
dth: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border=
-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: =
none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-to=
p-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: =
&amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-si=
ze: 13px; font-style: normal; font-variant: normal; font-weight: 400; lette=
r-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
 margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; t=
ext-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; whit=
e-space: normal; word-spacing: 0px;"><div style=3D"border-bottom-color: rgb=
(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-i=
mage-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bor=
der-image-source: none; border-image-width: 1; border-left-color: rgb(34, 3=
4, 34); border-left-style: none; border-left-width: 0px; border-right-color=
: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; borde=
r-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px=
; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;=
 padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0=
px;"><br style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style=
: none; border-bottom-width: 0px; border-image-outset: 0; border-image-repe=
at: stretch; border-image-slice: 100%; border-image-source: none; border-im=
age-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; =
border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-s=
tyle: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bor=
der-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); line-he=
ight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; marg=
in-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; pa=
dding-top: 0px;"></div><div style=3D"border-bottom-color: rgb(34, 34, 34); =
border-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0=
; border-image-repeat: stretch; border-image-slice: 100%; border-image-sour=
ce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border=
-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, =
34); border-right-style: none; border-right-width: 0px; border-top-color: r=
gb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-botto=
m: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">The main =
feature here would be the automatic introduction of types. A bit like a tem=
plate instantiation. It is implicit.<br style=3D"border-bottom-color: rgb(3=
4, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34,=
 34); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; =
color: rgb(34, 34, 34); line-height: normal; margin-bottom: 0px; margin-lef=
t: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px;"></div></div></blockquote><d=
iv><br></div><div>Automatic introduction is not that good of a barging - we=
 invent new rules to save some typing, but new problems arise.=C2=A0</div><=
div><br></div><div>Where are tags created? How can we make them template? H=
ow can we add attributes to them? Is this really new signature?</div><div><=
br></div><div><b>Sidenote</b>, how do you name the type to create a functio=
n signature?<font face=3D"courier new,monospace"> decltype(name:)</font>? <=
font face=3D"courier new,monospace">name:</font> to mean different things i=
n different contexts? Things escalate quickly.=C2=A0</div><div><br></div><d=
iv>In the end, I made it all as conservative as possible and as much based =
on current practice as possible. The initial simplicity was deceiving, beca=
use it was just a morning idea.</div><div><br></div><div>This is not to say=
 we could not use some shortcut syntax.</div><div><br></div><div>We could</=
div><div><br></div><font face=3D"courier new,monospace">int foo(tag_name: f=
loat f);</font><div><br></div><div>generate</div><div><br></div><div><span =
style=3D"text-align: left; color: rgb(34, 34, 34); text-transform: none; te=
xt-indent: 0px; letter-spacing: normal; font-size: 13px; font-style: normal=
; font-variant: normal; font-weight: 400; text-decoration: none; word-spaci=
ng: 0px; display: inline !important; white-space: normal; orphans: 2; float=
: none; -webkit-text-stroke-width: 0px; background-color: transparent;"><fo=
nt face=3D"courier new,monospace">case struct tag_name; //&lt; enclosing sc=
ope</font></span><b></b><i></i><u></u><sub></sub><sup></sup><strike></strik=
e><br></div><div><font face=3D"courier new,monospace">i<span style=3D"text-=
align: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px=
; letter-spacing: normal; font-size: 13px; font-style: normal; font-variant=
: normal; font-weight: 400; text-decoration: none; word-spacing: 0px; displ=
ay: inline !important; white-space: normal; orphans: 2; float: none; -webki=
t-text-stroke-width: 0px; background-color: transparent;">nt foo(case tag_n=
ame, float f);</span></font></div><div><font face=3D"courier new,monospace"=
><span style=3D"text-align: left; color: rgb(34, 34, 34); text-transform: n=
one; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-style:=
 normal; font-variant: normal; font-weight: 400; text-decoration: none; wor=
d-spacing: 0px; display: inline !important; white-space: normal; orphans: 2=
; float: none; -webkit-text-stroke-width: 0px; background-color: transparen=
t;"><br></span></font></div><div><span style=3D"text-align: left; color: rg=
b(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: norm=
al; font-size: 13px; font-style: normal; font-variant: normal; font-weight:=
 400; text-decoration: none; word-spacing: 0px; display: inline !important;=
 white-space: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0=
px; background-color: transparent;"><font face=3D"arial,sans-serif">But I s=
till question the pros/cons ratio.=C2=A0</font></span></div><div><font face=
=3D"courier new,monospace"></font><br></div><div><b></b><i></i><u></u><sub>=
</sub><sup></sup><strike></strike><font face=3D"courier new,monospace"></fo=
nt><br></div><div><br></div><blockquote class=3D"gmail_quote" style=3D"marg=
in: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, =
204); border-left-width: 1px; border-left-style: solid;"><div style=3D"back=
ground-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bot=
tom-style: none; border-bottom-width: 0px; border-image-outset: 0; border-i=
mage-repeat: stretch; border-image-slice: 100%; border-image-source: none; =
border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-styl=
e: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); borde=
r-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34,=
 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34)=
; font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans=
-serif; font-size: 13px; font-style: normal; font-variant: normal; font-wei=
ght: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; mar=
gin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-l=
eft: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-deco=
ration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-w=
idth: 0px; white-space: normal; word-spacing: 0px;"><div style=3D"border-bo=
ttom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width=
: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-s=
lice: 100%; border-image-source: none; border-image-width: 1; border-left-c=
olor: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bor=
der-right-color: rgb(34, 34, 34); border-right-style: none; border-right-wi=
dth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border=
-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; m=
argin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px;=
 padding-top: 0px;"></div><div style=3D"border-bottom-color: rgb(34, 34, 34=
); border-bottom-style: none; border-bottom-width: 0px; border-image-outset=
: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-s=
ource: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bor=
der-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 3=
4, 34); border-right-style: none; border-right-width: 0px; border-top-color=
: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bo=
ttom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bo=
ttom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><br st=
yle=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bor=
der-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch=
; border-image-slice: 100%; border-image-source: none; border-image-width: =
1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-left=
-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none;=
 border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-sty=
le: none; border-top-width: 0px; color: rgb(34, 34, 34); line-height: norma=
l; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px=
; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: =
0px;"></div><div style=3D"border-bottom-color: rgb(34, 34, 34); border-bott=
om-style: none; border-bottom-width: 0px; border-image-outset: 0; border-im=
age-repeat: stretch; border-image-slice: 100%; border-image-source: none; b=
order-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style=
: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border=
-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, =
34); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; mar=
gin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pad=
ding-left: 0px; padding-right: 0px; padding-top: 0px;">In your first propos=
al, you mentioned you wanted to be able to do something like that:</div><di=
v style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none;=
 border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: str=
etch; border-image-slice: 100%; border-image-source: none; border-image-wid=
th: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-=
left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: n=
one; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top=
-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; =
margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px;=
 padding-right: 0px; padding-top: 0px;"><div style=3D"background-color: rgb=
(250, 250, 250); border-bottom-color: rgb(187, 187, 187); border-bottom-sty=
le: solid; border-bottom-width: 1px; border-image-outset: 0; border-image-r=
epeat: stretch; border-image-slice: 100%; border-image-source: none; border=
-image-width: 1; border-left-color: rgb(187, 187, 187); border-left-style: =
solid; border-left-width: 1px; border-right-color: rgb(187, 187, 187); bord=
er-right-style: solid; border-right-width: 1px; border-top-color: rgb(187, =
187, 187); border-top-style: solid; border-top-width: 1px; margin-bottom: 0=
px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><code style=
=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border=
-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; b=
order-image-slice: 100%; border-image-source: none; border-image-width: 1; =
border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bo=
rder-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style:=
 none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddin=
g-right: 0px; padding-top: 0px;"><div style=3D"border-bottom-color: rgb(34,=
 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image=
-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-=
image-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 3=
4); border-left-style: none; border-left-width: 0px; border-right-color: rg=
b(34, 34, 34); border-right-style: none; border-right-width: 0px; border-to=
p-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"=
><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: non=
e; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: s=
tretch; border-image-slice: 100%; border-image-source: none; border-image-w=
idth: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none;=
 border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style:=
 none; border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; marg=
in-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padd=
ing-left: 0px; padding-right: 0px; padding-top: 0px;">any</span><span style=
=3D"border-bottom-color: rgb(102, 102, 0); border-bottom-style: none; borde=
r-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; =
border-image-slice: 100%; border-image-source: none; border-image-width: 1;=
 border-left-color: rgb(102, 102, 0); border-left-style: none; border-left-=
width: 0px; border-right-color: rgb(102, 102, 0); border-right-style: none;=
 border-right-width: 0px; border-top-color: rgb(102, 102, 0); border-top-st=
yle: none; border-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0=
px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span=
 style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; bor=
der-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch=
; border-image-slice: 100%; border-image-source: none; border-image-width: =
1; border-left-color: rgb(0, 0, 0); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none; borde=
r-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none;=
 border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-lef=
t: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px;">in_place</span><span style=
=3D"border-bottom-color: rgb(0, 136, 0); border-bottom-style: none; border-=
bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bo=
rder-image-slice: 100%; border-image-source: none; border-image-width: 1; b=
order-left-color: rgb(0, 136, 0); border-left-style: none; border-left-widt=
h: 0px; border-right-color: rgb(0, 136, 0); border-right-style: none; borde=
r-right-width: 0px; border-top-color: rgb(0, 136, 0); border-top-style: non=
e; border-top-width: 0px; color: rgb(0, 136, 0); margin-bottom: 0px; margin=
-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddin=
g-left: 0px; padding-right: 0px; padding-top: 0px;">&lt;string&gt;</span><s=
pan style=3D"border-bottom-color: rgb(102, 102, 0); border-bottom-style: no=
ne; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: =
stretch; border-image-slice: 100%; border-image-source: none; border-image-=
width: 1; border-left-color: rgb(102, 102, 0); border-left-style: none; bor=
der-left-width: 0px; border-right-color: rgb(102, 102, 0); border-right-sty=
le: none; border-right-width: 0px; border-top-color: rgb(102, 102, 0); bord=
er-top-style: none; border-top-width: 0px; color: rgb(102, 102, 0); margin-=
bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-=
bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">:</s=
pan><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; borde=
r-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: no=
ne; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-sty=
le: none; border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; m=
argin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; p=
adding-left: 0px; padding-right: 0px; padding-top: 0px;"> </span><span styl=
e=3D"border-bottom-color: rgb(0, 136, 0); border-bottom-style: none; border=
-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; b=
order-image-slice: 100%; border-image-source: none; border-image-width: 1; =
border-left-color: rgb(0, 136, 0); border-left-style: none; border-left-wid=
th: 0px; border-right-color: rgb(0, 136, 0); border-right-style: none; bord=
er-right-width: 0px; border-top-color: rgb(0, 136, 0); border-top-style: no=
ne; border-top-width: 0px; color: rgb(0, 136, 0); margin-bottom: 0px; margi=
n-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddi=
ng-left: 0px; padding-right: 0px; padding-top: 0px;">&quot;&quot;</span><sp=
an style=3D"border-bottom-color: rgb(102, 102, 0); border-bottom-style: non=
e; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: s=
tretch; border-image-slice: 100%; border-image-source: none; border-image-w=
idth: 1; border-left-color: rgb(102, 102, 0); border-left-style: none; bord=
er-left-width: 0px; border-right-color: rgb(102, 102, 0); border-right-styl=
e: none; border-right-width: 0px; border-top-color: rgb(102, 102, 0); borde=
r-top-style: none; border-top-width: 0px; color: rgb(102, 102, 0); margin-b=
ottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-b=
ottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">);</s=
pan><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; borde=
r-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: no=
ne; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-sty=
le: none; border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; m=
argin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; p=
adding-left: 0px; padding-right: 0px; padding-top: 0px;"><br style=3D"borde=
r-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-widt=
h: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-=
slice: 100%; border-image-source: none; border-image-width: 1; border-left-=
color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; borde=
r-right-color: rgb(0, 0, 0); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-wid=
th: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-to=
p: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px;"></span></div></code></div>I don&#39;t think it is useful. you a=
re not naming an argument here.</div></div></blockquote><div><br></div><div=
>In <i>most</i> cases tags are used it is not as if the argument is named.=
=C2=A0</div><div><br></div><div>Here it says &quot;<i>string arguments here=
<b>:</b></i>&quot; and for that colon is grammatically correct.<br></div><d=
iv><span style=3D"background-color: transparent; border-bottom-color: rgb(1=
02, 102, 0); border-bottom-style: none; border-bottom-width: 0px; border-im=
age-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bord=
er-image-source: none; border-image-width: 1; border-left-color: rgb(102, 1=
02, 0); border-left-style: none; border-left-width: 0px; border-right-color=
: rgb(102, 102, 0); border-right-style: none; border-right-width: 0px; bord=
er-top-color: rgb(102, 102, 0); border-top-style: none; border-top-width: 0=
px; color: rgb(102, 102, 0); font-family: &amp;quot;Arial&amp;quot;,&amp;qu=
ot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; fon=
t-variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom:=
 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; =
text-align: left; text-decoration: none; text-indent: 0px; text-transform: =
none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0p=
x;"><br></span></div><div><span style=3D"background-color: transparent; bor=
der-bottom-color: rgb(102, 102, 0); border-bottom-style: none; border-botto=
m-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-=
image-slice: 100%; border-image-source: none; border-image-width: 1; border=
-left-color: rgb(102, 102, 0); border-left-style: none; border-left-width: =
0px; border-right-color: rgb(102, 102, 0); border-right-style: none; border=
-right-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: no=
ne; border-top-width: 0px; color: rgb(102, 102, 0); font-family: &amp;quot;=
Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; =
font-style: normal; font-variant: normal; font-weight: 400; letter-spacing:=
 normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-to=
p: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: =
0px; padding-top: 0px; text-align: left; text-decoration: none; text-indent=
: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: n=
ormal; word-spacing: 0px;"><br></span></div><div>Also not naming an argumen=
t, but still grammatically correct:</div><div><br><font face=3D"courier new=
,monospace">shared_lock( defer_lock: mtx);=C2=A0<br>shared_lock( try_to_loc=
k: mtx);<br></font></div><div><font face=3D"courier new,monospace">shared_l=
ock( adopt_lock: mtx);</font></div><div><br></div><div>As in &quot;...<i>th=
e lock of<b>:</b> [the mutex]</i>&quot;</div><div><span style=3D"background=
-color: transparent; border-bottom-color: rgb(102, 102, 0); border-bottom-s=
tyle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-=
repeat: stretch; border-image-slice: 100%; border-image-source: none; borde=
r-image-width: 1; border-left-color: rgb(102, 102, 0); border-left-style: n=
one; border-left-width: 0px; border-right-color: rgb(102, 102, 0); border-r=
ight-style: none; border-right-width: 0px; border-top-color: rgb(102, 102, =
0); border-top-style: none; border-top-width: 0px; color: rgb(102, 102, 0);=
 font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-=
serif; font-size: 13px; font-style: normal; font-variant: normal; font-weig=
ht: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decor=
ation: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-wi=
dth: 0px; white-space: normal; word-spacing: 0px;"><b></b><i></i><u></u><su=
b></sub><sup></sup><strike></strike><br></span><span style=3D"background-co=
lor: transparent; border-bottom-color: rgb(0, 0, 0); border-bottom-style: n=
one; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat:=
 stretch; border-image-slice: 100%; border-image-source: none; border-image=
-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; border=
-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: non=
e; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-styl=
e: none; border-top-width: 0px; color: rgb(0, 0, 0); font-family: &amp;quot=
;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px;=
 font-style: normal; font-variant: normal; font-weight: 400; letter-spacing=
: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right:=
 0px; padding-top: 0px; text-align: left; text-decoration: none; text-inden=
t: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: =
normal; word-spacing: 0px;"></span></div><blockquote class=3D"gmail_quote" =
style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: r=
gb(204, 204, 204); border-left-width: 1px; border-left-style: solid;"><div =
style=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34=
); border-bottom-style: none; border-bottom-width: 0px; border-image-outset=
: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-s=
ource: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bor=
der-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 3=
4, 34); border-right-style: none; border-right-width: 0px; border-top-color=
: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rg=
b(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&a=
mp;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: nor=
mal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-l=
eft: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: le=
ft; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-=
text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><div style=
=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border=
-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; b=
order-image-slice: 100%; border-image-source: none; border-image-width: 1; =
border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bo=
rder-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style:=
 none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddin=
g-right: 0px; padding-top: 0px;"><b></b><i></i><u></u><sub></sub><sup></sup=
><strike></strike><br style=3D"border-bottom-color: rgb(34, 34, 34); border=
-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bord=
er-image-repeat: stretch; border-image-slice: 100%; border-image-source: no=
ne; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); b=
order-right-style: none; border-right-width: 0px; border-top-color: rgb(34,=
 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34,=
 34); line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-rig=
ht: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-r=
ight: 0px; padding-top: 0px;"></div><div style=3D"border-bottom-color: rgb(=
34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-im=
age-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bord=
er-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34=
, 34); border-left-style: none; border-left-width: 0px; border-right-color:=
 rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border=
-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px;=
 margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; =
padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0p=
x;">Now, to be fair, you could do something equivalent in C++20:</div><div =
style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; b=
order-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stret=
ch; border-image-slice: 100%; border-image-source: none; border-image-width=
: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-le=
ft-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: non=
e; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-s=
tyle: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; ma=
rgin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; p=
adding-right: 0px; padding-top: 0px;"><div style=3D"background-color: rgb(2=
50, 250, 250); border-bottom-color: rgb(187, 187, 187); border-bottom-style=
: solid; border-bottom-width: 1px; border-image-outset: 0; border-image-rep=
eat: stretch; border-image-slice: 100%; border-image-source: none; border-i=
mage-width: 1; border-left-color: rgb(187, 187, 187); border-left-style: so=
lid; border-left-width: 1px; border-right-color: rgb(187, 187, 187); border=
-right-style: solid; border-right-width: 1px; border-top-color: rgb(187, 18=
7, 187); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px=
; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><code style=3D"=
border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bot=
tom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; borde=
r-image-slice: 100%; border-image-source: none; border-image-width: 1; bord=
er-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width:=
 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; border=
-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: non=
e; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-righ=
t: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-ri=
ght: 0px; padding-top: 0px;"><div style=3D"border-bottom-color: rgb(34, 34,=
 34); border-bottom-style: none; border-bottom-width: 0px; border-image-out=
set: 0; border-image-repeat: stretch; border-image-slice: 100%; border-imag=
e-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); =
border-left-style: none; border-left-width: 0px; border-right-color: rgb(34=
, 34, 34); border-right-style: none; border-right-width: 0px; border-top-co=
lor: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin=
-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding=
-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><sp=
an style=3D"border-bottom-color: rgb(0, 0, 136); border-bottom-style: none;=
 border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: str=
etch; border-image-slice: 100%; border-image-source: none; border-image-wid=
th: 1; border-left-color: rgb(0, 0, 136); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(0, 0, 136); border-right-style: non=
e; border-right-width: 0px; border-top-color: rgb(0, 0, 136); border-top-st=
yle: none; border-top-width: 0px; color: rgb(0, 0, 136); margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px=
; padding-left: 0px; padding-right: 0px; padding-top: 0px;">int</span><span=
 style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; bor=
der-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch=
; border-image-slice: 100%; border-image-source: none; border-image-width: =
1; border-left-color: rgb(0, 0, 0); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none; borde=
r-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none;=
 border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-lef=
t: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px;"> foo</span><span style=3D"b=
order-bottom-color: rgb(102, 102, 0); border-bottom-style: none; border-bot=
tom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; borde=
r-image-slice: 100%; border-image-source: none; border-image-width: 1; bord=
er-left-color: rgb(102, 102, 0); border-left-style: none; border-left-width=
: 0px; border-right-color: rgb(102, 102, 0); border-right-style: none; bord=
er-right-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: =
none; border-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; m=
argin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; p=
adding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span styl=
e=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-b=
ottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bor=
der-image-slice: 100%; border-image-source: none; border-image-width: 1; bo=
rder-left-color: rgb(0, 0, 0); border-left-style: none; border-left-width: =
0px; border-right-color: rgb(0, 0, 0); border-right-style: none; border-rig=
ht-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; bord=
er-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0p=
x; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0=
px; padding-right: 0px; padding-top: 0px;">std</span><span style=3D"border-=
bottom-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-wi=
dth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-imag=
e-slice: 100%; border-image-source: none; border-image-width: 1; border-lef=
t-color: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px;=
 border-right-color: rgb(102, 102, 0); border-right-style: none; border-rig=
ht-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; =
border-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-=
left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding=
-left: 0px; padding-right: 0px; padding-top: 0px;">::</span><span style=3D"=
border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-slice: 100%; border-image-source: none; border-image-width: 1; border-=
left-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; =
border-right-color: rgb(0, 0, 0); border-right-style: none; border-right-wi=
dth: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-to=
p-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; ma=
rgin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; p=
adding-right: 0px; padding-top: 0px;">tag</span><span style=3D"border-botto=
m-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-width: =
0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sli=
ce: 100%; border-image-source: none; border-image-width: 1; border-left-col=
or: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; bord=
er-right-color: rgb(102, 102, 0); border-right-style: none; border-right-wi=
dth: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; borde=
r-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left:=
 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left=
: 0px; padding-right: 0px; padding-top: 0px;">&lt;</span><span style=3D"bor=
der-bottom-color: rgb(0, 136, 0); border-bottom-style: none; border-bottom-=
width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-im=
age-slice: 100%; border-image-source: none; border-image-width: 1; border-l=
eft-color: rgb(0, 136, 0); border-left-style: none; border-left-width: 0px;=
 border-right-color: rgb(0, 136, 0); border-right-style: none; border-right=
-width: 0px; border-top-color: rgb(0, 136, 0); border-top-style: none; bord=
er-top-width: 0px; color: rgb(0, 136, 0); margin-bottom: 0px; margin-left: =
0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left:=
 0px; padding-right: 0px; padding-top: 0px;">&quot;tag_name&quot;</span><sp=
an style=3D"border-bottom-color: rgb(102, 102, 0); border-bottom-style: non=
e; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: s=
tretch; border-image-slice: 100%; border-image-source: none; border-image-w=
idth: 1; border-left-color: rgb(102, 102, 0); border-left-style: none; bord=
er-left-width: 0px; border-right-color: rgb(102, 102, 0); border-right-styl=
e: none; border-right-width: 0px; border-top-color: rgb(102, 102, 0); borde=
r-top-style: none; border-top-width: 0px; color: rgb(102, 102, 0); margin-b=
ottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-b=
ottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">&gt;,=
</span><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-styl=
e: none; border-bottom-width: 0px; border-image-outset: 0; border-image-rep=
eat: stretch; border-image-slice: 100%; border-image-source: none; border-i=
mage-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; bo=
rder-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style:=
 none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-=
style: none; border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px=
; padding-left: 0px; padding-right: 0px; padding-top: 0px;"> </span><span s=
tyle=3D"border-bottom-color: rgb(0, 0, 136); border-bottom-style: none; bor=
der-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch=
; border-image-slice: 100%; border-image-source: none; border-image-width: =
1; border-left-color: rgb(0, 0, 136); border-left-style: none; border-left-=
width: 0px; border-right-color: rgb(0, 0, 136); border-right-style: none; b=
order-right-width: 0px; border-top-color: rgb(0, 0, 136); border-top-style:=
 none; border-top-width: 0px; color: rgb(0, 0, 136); margin-bottom: 0px; ma=
rgin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pa=
dding-left: 0px; padding-right: 0px; padding-top: 0px;">float</span><span s=
tyle=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; borde=
r-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; =
border-image-slice: 100%; border-image-source: none; border-image-width: 1;=
 border-left-color: rgb(0, 0, 0); border-left-style: none; border-left-widt=
h: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none; border-=
right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; b=
order-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left:=
 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left=
: 0px; padding-right: 0px; padding-top: 0px;"> f</span><span style=3D"borde=
r-bottom-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-=
width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-im=
age-slice: 100%; border-image-source: none; border-image-width: 1; border-l=
eft-color: rgb(102, 102, 0); border-left-style: none; border-left-width: 0p=
x; border-right-color: rgb(102, 102, 0); border-right-style: none; border-r=
ight-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none=
; border-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margi=
n-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddi=
ng-left: 0px; padding-right: 0px; padding-top: 0px;">);</span><span style=
=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bo=
ttom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bord=
er-image-slice: 100%; border-image-source: none; border-image-width: 1; bor=
der-left-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0=
px; border-right-color: rgb(0, 0, 0); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; borde=
r-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px=
; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0p=
x; padding-right: 0px; padding-top: 0px;"><br style=3D"border-bottom-color:=
 rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-=
image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bo=
rder-image-source: none; border-image-width: 1; border-left-color: rgb(0, 0=
, 0); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(0, 0, 0); border-right-style: none; border-right-width: 0px; border-top=
-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; margin=
-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding=
-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><br=
 style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; bor=
der-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch=
; border-image-slice: 100%; border-image-source: none; border-image-width: =
1; border-left-color: rgb(0, 0, 0); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none; borde=
r-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none;=
 border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right:=
 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px;">foo</span><span style=3D"border-bottom-color: rg=
b(102, 102, 0); border-bottom-style: none; border-bottom-width: 0px; border=
-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; b=
order-image-source: none; border-image-width: 1; border-left-color: rgb(102=
, 102, 0); border-left-style: none; border-left-width: 0px; border-right-co=
lor: rgb(102, 102, 0); border-right-style: none; border-right-width: 0px; b=
order-top-color: rgb(102, 102, 0); border-top-style: none; border-top-width=
: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margi=
n-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padd=
ing-right: 0px; padding-top: 0px;">(</span><span style=3D"border-bottom-col=
or: rgb(0, 136, 0); border-bottom-style: none; border-bottom-width: 0px; bo=
rder-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100=
%; border-image-source: none; border-image-width: 1; border-left-color: rgb=
(0, 136, 0); border-left-style: none; border-left-width: 0px; border-right-=
color: rgb(0, 136, 0); border-right-style: none; border-right-width: 0px; b=
order-top-color: rgb(0, 136, 0); border-top-style: none; border-top-width: =
0px; color: rgb(0, 136, 0); margin-bottom: 0px; margin-left: 0px; margin-ri=
ght: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-=
right: 0px; padding-top: 0px;">&quot;tag_name&quot;</span><span style=3D"bo=
rder-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-w=
idth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-ima=
ge-slice: 100%; border-image-source: none; border-image-width: 1; border-le=
ft-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(0, 0, 0); border-right-style: none; border-right-widt=
h: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-=
width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px;">tag</span><span style=3D"border-bottom-=
color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-width: 0p=
x; border-image-outset: 0; border-image-repeat: stretch; border-image-slice=
: 100%; border-image-source: none; border-image-width: 1; border-left-color=
: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; border=
-right-color: rgb(102, 102, 0); border-right-style: none; border-right-widt=
h: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; border-=
top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0=
px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: =
0px; padding-right: 0px; padding-top: 0px;">,</span><span style=3D"border-b=
ottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: =
0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sli=
ce: 100%; border-image-source: none; border-image-width: 1; border-left-col=
or: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0px=
; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-width:=
 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-rig=
ht: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-r=
ight: 0px; padding-top: 0px;"> </span><span style=3D"border-bottom-color: r=
gb(0, 102, 102); border-bottom-style: none; border-bottom-width: 0px; borde=
r-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; =
border-image-source: none; border-image-width: 1; border-left-color: rgb(0,=
 102, 102); border-left-style: none; border-left-width: 0px; border-right-c=
olor: rgb(0, 102, 102); border-right-style: none; border-right-width: 0px; =
border-top-color: rgb(0, 102, 102); border-top-style: none; border-top-widt=
h: 0px; color: rgb(0, 102, 102); margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px;">1.f</span><span style=3D"border-bottom-=
color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-width: 0p=
x; border-image-outset: 0; border-image-repeat: stretch; border-image-slice=
: 100%; border-image-source: none; border-image-width: 1; border-left-color=
: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; border=
-right-color: rgb(102, 102, 0); border-right-style: none; border-right-widt=
h: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; border-=
top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0=
px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: =
0px; padding-right: 0px; padding-top: 0px;">);</span><span style=3D"border-=
bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width:=
 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sl=
ice: 100%; border-image-source: none; border-image-width: 1; border-left-co=
lor: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; border-=
right-color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0p=
x; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-width=
: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-ri=
ght: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-=
right: 0px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb(0, 0, =
0); border-bottom-style: none; border-bottom-width: 0px; border-image-outse=
t: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-=
source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); borde=
r-left-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(0, 0, 0); border-top-style: none; border-top-width: 0px; margin-bottom: 0p=
x; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0p=
x; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></span></div><=
/code></div></div><div style=3D"border-bottom-color: rgb(34, 34, 34); borde=
r-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bor=
der-image-repeat: stretch; border-image-slice: 100%; border-image-source: n=
one; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left=
-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(34=
, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom: 0p=
x; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0p=
x; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><br style=3D"b=
order-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bott=
om-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border=
-image-slice: 100%; border-image-source: none; border-image-width: 1; borde=
r-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: =
0px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-=
right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none=
; border-top-width: 0px; color: rgb(34, 34, 34); line-height: normal; margi=
n-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; paddin=
g-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></=
div><div style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style=
: none; border-bottom-width: 0px; border-image-outset: 0; border-image-repe=
at: stretch; border-image-slice: 100%; border-image-source: none; border-im=
age-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; =
border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-s=
tyle: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bor=
der-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left=
: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px;">But the shorthand syntax wou=
ld be very nice.</div><div style=3D"border-bottom-color: rgb(34, 34, 34); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
 border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-=
left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 3=
4); border-right-style: none; border-right-width: 0px; border-top-color: rg=
b(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom=
: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom=
: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Moreover, =
such a shorthand syntax would give people incentives to use it (I consider =
it a good thing).</div><div style=3D"border-bottom-color: rgb(34, 34, 34); =
border-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0=
; border-image-repeat: stretch; border-image-slice: 100%; border-image-sour=
ce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border=
-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, =
34); border-right-style: none; border-right-width: 0px; border-top-color: r=
gb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-botto=
m: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Let&#39;s=
 make a quick poll. Which one do you prefer? (try to see it as a newcomer t=
o the language)<br style=3D"border-bottom-color: rgb(34, 34, 34); border-bo=
ttom-style: none; border-bottom-width: 0px; border-image-outset: 0; border-=
image-repeat: stretch; border-image-slice: 100%; border-image-source: none;=
 border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-sty=
le: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bord=
er-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34=
, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34=
); line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right:=
 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px;"></div><div style=3D"border-bottom-color: rgb(34,=
 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image=
-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-=
image-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 3=
4); border-left-style: none; border-left-width: 0px; border-right-color: rg=
b(34, 34, 34); border-right-style: none; border-right-width: 0px; border-to=
p-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"=
><div style=3D"background-color: rgb(250, 250, 250); border-bottom-color: r=
gb(187, 187, 187); border-bottom-style: solid; border-bottom-width: 1px; bo=
rder-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100=
%; border-image-source: none; border-image-width: 1; border-left-color: rgb=
(187, 187, 187); border-left-style: solid; border-left-width: 1px; border-r=
ight-color: rgb(187, 187, 187); border-right-style: solid; border-right-wid=
th: 1px; border-top-color: rgb(187, 187, 187); border-top-style: solid; bor=
der-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px=
; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0=
px; padding-top: 0px;"><code style=3D"border-bottom-color: rgb(34, 34, 34);=
 border-bottom-style: none; border-bottom-width: 0px; border-image-outset: =
0; border-image-repeat: stretch; border-image-slice: 100%; border-image-sou=
rce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); borde=
r-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34,=
 34); border-right-style: none; border-right-width: 0px; border-top-color: =
rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bott=
om: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bott=
om: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div sty=
le=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bord=
er-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch;=
 border-image-slice: 100%; border-image-source: none; border-image-width: 1=
; border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-=
width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; =
border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-styl=
e: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margi=
n-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padd=
ing-right: 0px; padding-top: 0px;"><span style=3D"border-bottom-color: rgb(=
0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-image=
-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-=
image-source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0);=
 border-left-style: none; border-left-width: 0px; border-right-color: rgb(0=
, 0, 0); border-right-style: none; border-right-width: 0px; border-top-colo=
r: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; color: rgb(=
0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px;">std</span><span style=3D"border-bottom-color: rgb(102, 102, 0)=
; border-bottom-style: none; border-bottom-width: 0px; border-image-outset:=
 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-so=
urce: none; border-image-width: 1; border-left-color: rgb(102, 102, 0); bor=
der-left-style: none; border-left-width: 0px; border-right-color: rgb(102, =
102, 0); border-right-style: none; border-right-width: 0px; border-top-colo=
r: rgb(102, 102, 0); border-top-style: none; border-top-width: 0px; color: =
rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; =
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px=
; padding-top: 0px;">::</span><span style=3D"border-bottom-color: rgb(0, 0,=
 0); border-bottom-style: none; border-bottom-width: 0px; border-image-outs=
et: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image=
-source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); bord=
er-left-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, =
0); border-right-style: none; border-right-width: 0px; border-top-color: rg=
b(0, 0, 0); border-top-style: none; border-top-width: 0px; color: rgb(0, 0,=
 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0=
px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top=
: 0px;">find_if</span><span style=3D"border-bottom-color: rgb(102, 102, 0);=
 border-bottom-style: none; border-bottom-width: 0px; border-image-outset: =
0; border-image-repeat: stretch; border-image-slice: 100%; border-image-sou=
rce: none; border-image-width: 1; border-left-color: rgb(102, 102, 0); bord=
er-left-style: none; border-left-width: 0px; border-right-color: rgb(102, 1=
02, 0); border-right-style: none; border-right-width: 0px; border-top-color=
: rgb(102, 102, 0); border-top-style: none; border-top-width: 0px; color: r=
gb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; m=
argin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px;=
 padding-top: 0px;">(</span><span style=3D"border-bottom-color: rgb(0, 0, 0=
); border-bottom-style: none; border-bottom-width: 0px; border-image-outset=
: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-s=
ource: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); border=
-left-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0)=
; border-right-style: none; border-right-width: 0px; border-top-color: rgb(=
0, 0, 0); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0=
); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px=
; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: =
0px;">v</span><span style=3D"border-bottom-color: rgb(102, 102, 0); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(102, 102, 0); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(102, 102, 0); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(10=
2, 102, 0); border-top-style: none; border-top-width: 0px; color: rgb(102, =
102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-to=
p: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px;">.</span><span style=3D"border-bottom-color: rgb(0, 0, 136); bor=
der-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; b=
order-image-repeat: stretch; border-image-slice: 100%; border-image-source:=
 none; border-image-width: 1; border-left-color: rgb(0, 0, 136); border-lef=
t-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 136); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(0,=
 0, 136); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 1=
36); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0=
px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top=
: 0px;">begin</span><span style=3D"border-bottom-color: rgb(102, 102, 0); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
 border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(102, 102, 0); border=
-left-style: none; border-left-width: 0px; border-right-color: rgb(102, 102=
, 0); border-right-style: none; border-right-width: 0px; border-top-color: =
rgb(102, 102, 0); border-top-style: none; border-top-width: 0px; color: rgb=
(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; mar=
gin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; p=
adding-top: 0px;">(),</span><span style=3D"border-bottom-color: rgb(0, 0, 0=
); border-bottom-style: none; border-bottom-width: 0px; border-image-outset=
: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-s=
ource: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); border=
-left-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0)=
; border-right-style: none; border-right-width: 0px; border-top-color: rgb(=
0, 0, 0); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0=
); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px=
; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: =
0px;"> v</span><span style=3D"border-bottom-color: rgb(102, 102, 0); border=
-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bord=
er-image-repeat: stretch; border-image-slice: 100%; border-image-source: no=
ne; border-image-width: 1; border-left-color: rgb(102, 102, 0); border-left=
-style: none; border-left-width: 0px; border-right-color: rgb(102, 102, 0);=
 border-right-style: none; border-right-width: 0px; border-top-color: rgb(1=
02, 102, 0); border-top-style: none; border-top-width: 0px; color: rgb(102,=
 102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px;">.</span><span style=3D"border-bottom-color: rgb(0, 0, 136); bo=
rder-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; =
border-image-repeat: stretch; border-image-slice: 100%; border-image-source=
: none; border-image-width: 1; border-left-color: rgb(0, 0, 136); border-le=
ft-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 136);=
 border-right-style: none; border-right-width: 0px; border-top-color: rgb(0=
, 0, 136); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, =
136); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: =
0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-to=
p: 0px;">end</span><span style=3D"border-bottom-color: rgb(102, 102, 0); bo=
rder-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; =
border-image-repeat: stretch; border-image-slice: 100%; border-image-source=
: none; border-image-width: 1; border-left-color: rgb(102, 102, 0); border-=
left-style: none; border-left-width: 0px; border-right-color: rgb(102, 102,=
 0); border-right-style: none; border-right-width: 0px; border-top-color: r=
gb(102, 102, 0); border-top-style: none; border-top-width: 0px; color: rgb(=
102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; marg=
in-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; pa=
dding-top: 0px;">(),</span><span style=3D"border-bottom-color: rgb(0, 0, 0)=
; border-bottom-style: none; border-bottom-width: 0px; border-image-outset:=
 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-so=
urce: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-=
left-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0);=
 border-right-style: none; border-right-width: 0px; border-top-color: rgb(0=
, 0, 0); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0)=
; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;=
 padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0=
px;"> functor</span><span style=3D"border-bottom-color: rgb(102, 102, 0); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
 border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(102, 102, 0); border=
-left-style: none; border-left-width: 0px; border-right-color: rgb(102, 102=
, 0); border-right-style: none; border-right-width: 0px; border-top-color: =
rgb(102, 102, 0); border-top-style: none; border-top-width: 0px; color: rgb=
(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; mar=
gin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; p=
adding-top: 0px;">);</span><span style=3D"border-bottom-color: rgb(0, 0, 0)=
; border-bottom-style: none; border-bottom-width: 0px; border-image-outset:=
 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-so=
urce: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-=
left-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0);=
 border-right-style: none; border-right-width: 0px; border-top-color: rgb(0=
, 0, 0); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0)=
; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;=
 padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0=
px;"><br style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: n=
one; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat:=
 stretch; border-image-slice: 100%; border-image-source: none; border-image=
-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; border=
-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: non=
e; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-styl=
e: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margi=
n-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padd=
ing-right: 0px; padding-top: 0px;">std</span><span style=3D"border-bottom-c=
olor: rgb(102, 102, 0); border-bottom-style: none; border-bottom-width: 0px=
; border-image-outset: 0; border-image-repeat: stretch; border-image-slice:=
 100%; border-image-source: none; border-image-width: 1; border-left-color:=
 rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; border-=
right-color: rgb(102, 102, 0); border-right-style: none; border-right-width=
: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; border-t=
op-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0p=
x; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0=
px; padding-right: 0px; padding-top: 0px;">::</span><span style=3D"border-b=
ottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: =
0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sli=
ce: 100%; border-image-source: none; border-image-width: 1; border-left-col=
or: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0px=
; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-width:=
 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-rig=
ht: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-r=
ight: 0px; padding-top: 0px;">find</span><span style=3D"border-bottom-color=
: rgb(102, 102, 0); border-bottom-style: none; border-bottom-width: 0px; bo=
rder-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100=
%; border-image-source: none; border-image-width: 1; border-left-color: rgb=
(102, 102, 0); border-left-style: none; border-left-width: 0px; border-righ=
t-color: rgb(102, 102, 0); border-right-style: none; border-right-width: 0p=
x; border-top-color: rgb(102, 102, 0); border-top-style: none; border-top-w=
idth: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px;">(</span><span style=3D"border-bottom=
-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; =
border-image-outset: 0; border-image-repeat: stretch; border-image-slice: 1=
00%; border-image-source: none; border-image-width: 1; border-left-color: r=
gb(0, 0, 0); border-left-style: none; border-left-width: 0px; border-right-=
color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0px; bor=
der-top-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px;=
 color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0=
px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right:=
 0px; padding-top: 0px;">v</span><span style=3D"border-bottom-color: rgb(10=
2, 102, 0); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(102, 10=
2, 0); border-left-style: none; border-left-width: 0px; border-right-color:=
 rgb(102, 102, 0); border-right-style: none; border-right-width: 0px; borde=
r-top-color: rgb(102, 102, 0); border-top-style: none; border-top-width: 0p=
x; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-ri=
ght: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-=
right: 0px; padding-top: 0px;">.</span><span style=3D"border-bottom-color: =
rgb(0, 0, 136); border-bottom-style: none; border-bottom-width: 0px; border=
-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; b=
order-image-source: none; border-image-width: 1; border-left-color: rgb(0, =
0, 136); border-left-style: none; border-left-width: 0px; border-right-colo=
r: rgb(0, 0, 136); border-right-style: none; border-right-width: 0px; borde=
r-top-color: rgb(0, 0, 136); border-top-style: none; border-top-width: 0px;=
 color: rgb(0, 0, 136); margin-bottom: 0px; margin-left: 0px; margin-right:=
 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px;">begin</span><span style=3D"border-bottom-color: =
rgb(102, 102, 0); border-bottom-style: none; border-bottom-width: 0px; bord=
er-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%;=
 border-image-source: none; border-image-width: 1; border-left-color: rgb(1=
02, 102, 0); border-left-style: none; border-left-width: 0px; border-right-=
color: rgb(102, 102, 0); border-right-style: none; border-right-width: 0px;=
 border-top-color: rgb(102, 102, 0); border-top-style: none; border-top-wid=
th: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; mar=
gin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pa=
dding-right: 0px; padding-top: 0px;">(),</span><span style=3D"border-bottom=
-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; =
border-image-outset: 0; border-image-repeat: stretch; border-image-slice: 1=
00%; border-image-source: none; border-image-width: 1; border-left-color: r=
gb(0, 0, 0); border-left-style: none; border-left-width: 0px; border-right-=
color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0px; bor=
der-top-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px;=
 color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0=
px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right:=
 0px; padding-top: 0px;"> v</span><span style=3D"border-bottom-color: rgb(1=
02, 102, 0); border-bottom-style: none; border-bottom-width: 0px; border-im=
age-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bord=
er-image-source: none; border-image-width: 1; border-left-color: rgb(102, 1=
02, 0); border-left-style: none; border-left-width: 0px; border-right-color=
: rgb(102, 102, 0); border-right-style: none; border-right-width: 0px; bord=
er-top-color: rgb(102, 102, 0); border-top-style: none; border-top-width: 0=
px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-r=
ight: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding=
-right: 0px; padding-top: 0px;">.</span><span style=3D"border-bottom-color:=
 rgb(0, 0, 136); border-bottom-style: none; border-bottom-width: 0px; borde=
r-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; =
border-image-source: none; border-image-width: 1; border-left-color: rgb(0,=
 0, 136); border-left-style: none; border-left-width: 0px; border-right-col=
or: rgb(0, 0, 136); border-right-style: none; border-right-width: 0px; bord=
er-top-color: rgb(0, 0, 136); border-top-style: none; border-top-width: 0px=
; color: rgb(0, 0, 136); margin-bottom: 0px; margin-left: 0px; margin-right=
: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-rig=
ht: 0px; padding-top: 0px;">end</span><span style=3D"border-bottom-color: r=
gb(102, 102, 0); border-bottom-style: none; border-bottom-width: 0px; borde=
r-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; =
border-image-source: none; border-image-width: 1; border-left-color: rgb(10=
2, 102, 0); border-left-style: none; border-left-width: 0px; border-right-c=
olor: rgb(102, 102, 0); border-right-style: none; border-right-width: 0px; =
border-top-color: rgb(102, 102, 0); border-top-style: none; border-top-widt=
h: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px;">(),</span><span style=3D"border-bottom-=
color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; b=
order-image-outset: 0; border-image-repeat: stretch; border-image-slice: 10=
0%; border-image-source: none; border-image-width: 1; border-left-color: rg=
b(0, 0, 0); border-left-style: none; border-left-width: 0px; border-right-c=
olor: rgb(0, 0, 0); border-right-style: none; border-right-width: 0px; bord=
er-top-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; =
color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0p=
x; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: =
0px; padding-top: 0px;"> </span><span style=3D"border-bottom-color: rgb(0, =
136, 0); border-bottom-style: none; border-bottom-width: 0px; border-image-=
outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-i=
mage-source: none; border-image-width: 1; border-left-color: rgb(0, 136, 0)=
; border-left-style: none; border-left-width: 0px; border-right-color: rgb(=
0, 136, 0); border-right-style: none; border-right-width: 0px; border-top-c=
olor: rgb(0, 136, 0); border-top-style: none; border-top-width: 0px; color:=
 rgb(0, 136, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; m=
argin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px;=
 padding-top: 0px;">&quot;if&quot;</span><span style=3D"border-bottom-color=
: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border=
-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; b=
order-image-source: none; border-image-width: 1; border-left-color: rgb(0, =
0, 0); border-left-style: none; border-left-width: 0px; border-right-color:=
 rgb(0, 0, 0); border-right-style: none; border-right-width: 0px; border-to=
p-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; color=
: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; ma=
rgin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; =
padding-top: 0px;">tag</span><span style=3D"border-bottom-color: rgb(102, 1=
02, 0); border-bottom-style: none; border-bottom-width: 0px; border-image-o=
utset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-im=
age-source: none; border-image-width: 1; border-left-color: rgb(102, 102, 0=
); border-left-style: none; border-left-width: 0px; border-right-color: rgb=
(102, 102, 0); border-right-style: none; border-right-width: 0px; border-to=
p-color: rgb(102, 102, 0); border-top-style: none; border-top-width: 0px; c=
olor: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-right:=
 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px;">,</span><span style=3D"border-bottom-color: rgb(=
0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-image=
-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-=
image-source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0);=
 border-left-style: none; border-left-width: 0px; border-right-color: rgb(0=
, 0, 0); border-right-style: none; border-right-width: 0px; border-top-colo=
r: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; color: rgb(=
0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px;"> functor</span><span style=3D"border-bottom-color: rgb(102, 10=
2, 0); border-bottom-style: none; border-bottom-width: 0px; border-image-ou=
tset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-ima=
ge-source: none; border-image-width: 1; border-left-color: rgb(102, 102, 0)=
; border-left-style: none; border-left-width: 0px; border-right-color: rgb(=
102, 102, 0); border-right-style: none; border-right-width: 0px; border-top=
-color: rgb(102, 102, 0); border-top-style: none; border-top-width: 0px; co=
lor: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: =
0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right=
: 0px; padding-top: 0px;">);</span><span style=3D"border-bottom-color: rgb(=
0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-image=
-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-=
image-source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0);=
 border-left-style: none; border-left-width: 0px; border-right-color: rgb(0=
, 0, 0); border-right-style: none; border-right-width: 0px; border-top-colo=
r: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; color: rgb(=
0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px;"><code style=3D"border-bottom-color: rgb(0, 0, 0); border-botto=
m-style: none; border-bottom-width: 0px; border-image-outset: 0; border-ima=
ge-repeat: stretch; border-image-slice: 100%; border-image-source: none; bo=
rder-image-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: no=
ne; border-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-=
style: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); borde=
r-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: =
0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left:=
 0px; padding-right: 0px; padding-top: 0px;"><span style=3D"border-bottom-c=
olor: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; bo=
rder-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100=
%; border-image-source: none; border-image-width: 1; border-left-color: rgb=
(0, 0, 0); border-left-style: none; border-left-width: 0px; border-right-co=
lor: rgb(0, 0, 0); border-right-style: none; border-right-width: 0px; borde=
r-top-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; c=
olor: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px=
; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0=
px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb(0, 0, 0); bord=
er-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bo=
rder-image-repeat: stretch; border-image-slice: 100%; border-image-source: =
none; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0); borde=
r-right-style: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0=
); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margi=
n-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddi=
ng-left: 0px; padding-right: 0px; padding-top: 0px;">std</span><span style=
=3D"border-bottom-color: rgb(102, 102, 0); border-bottom-style: none; borde=
r-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; =
border-image-slice: 100%; border-image-source: none; border-image-width: 1;=
 border-left-color: rgb(102, 102, 0); border-left-style: none; border-left-=
width: 0px; border-right-color: rgb(102, 102, 0); border-right-style: none;=
 border-right-width: 0px; border-top-color: rgb(102, 102, 0); border-top-st=
yle: none; border-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0=
px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">::</span><spa=
n style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; bo=
rder-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretc=
h; border-image-slice: 100%; border-image-source: none; border-image-width:=
 1; border-left-color: rgb(0, 0, 0); border-left-style: none; border-left-w=
idth: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none; bord=
er-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none=
; border-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-le=
ft: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-l=
eft: 0px; padding-right: 0px; padding-top: 0px;">find</span><span style=3D"=
border-bottom-color: rgb(102, 102, 0); border-bottom-style: none; border-bo=
ttom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bord=
er-image-slice: 100%; border-image-source: none; border-image-width: 1; bor=
der-left-color: rgb(102, 102, 0); border-left-style: none; border-left-widt=
h: 0px; border-right-color: rgb(102, 102, 0); border-right-style: none; bor=
der-right-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style:=
 none; border-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; =
margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; =
padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span sty=
le=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-=
bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bo=
rder-image-slice: 100%; border-image-source: none; border-image-width: 1; b=
order-left-color: rgb(0, 0, 0); border-left-style: none; border-left-width:=
 0px; border-right-color: rgb(0, 0, 0); border-right-style: none; border-ri=
ght-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; bor=
der-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0=
px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: =
0px; padding-right: 0px; padding-top: 0px;">v</span><span style=3D"border-b=
ottom-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-wid=
th: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image=
-slice: 100%; border-image-source: none; border-image-width: 1; border-left=
-color: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; =
border-right-color: rgb(102, 102, 0); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; b=
order-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-l=
eft: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-=
left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span style=3D"bo=
rder-bottom-color: rgb(0, 0, 136); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-slice: 100%; border-image-source: none; border-image-width: 1; border-=
left-color: rgb(0, 0, 136); border-left-style: none; border-left-width: 0px=
; border-right-color: rgb(0, 0, 136); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(0, 0, 136); border-top-style: none; bor=
der-top-width: 0px; color: rgb(0, 0, 136); margin-bottom: 0px; margin-left:=
 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left=
: 0px; padding-right: 0px; padding-top: 0px;">begin</span><span style=3D"bo=
rder-bottom-color: rgb(102, 102, 0); border-bottom-style: none; border-bott=
om-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border=
-image-slice: 100%; border-image-source: none; border-image-width: 1; borde=
r-left-color: rgb(102, 102, 0); border-left-style: none; border-left-width:=
 0px; border-right-color: rgb(102, 102, 0); border-right-style: none; borde=
r-right-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: n=
one; border-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; ma=
rgin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pa=
dding-left: 0px; padding-right: 0px; padding-top: 0px;">(),</span><span sty=
le=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-=
bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bo=
rder-image-slice: 100%; border-image-source: none; border-image-width: 1; b=
order-left-color: rgb(0, 0, 0); border-left-style: none; border-left-width:=
 0px; border-right-color: rgb(0, 0, 0); border-right-style: none; border-ri=
ght-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; bor=
der-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0=
px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: =
0px; padding-right: 0px; padding-top: 0px;"> v</span><span style=3D"border-=
bottom-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-wi=
dth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-imag=
e-slice: 100%; border-image-source: none; border-image-width: 1; border-lef=
t-color: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px;=
 border-right-color: rgb(102, 102, 0); border-right-style: none; border-rig=
ht-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; =
border-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-=
left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding=
-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span style=3D"b=
order-bottom-color: rgb(0, 0, 136); border-bottom-style: none; border-botto=
m-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-=
image-slice: 100%; border-image-source: none; border-image-width: 1; border=
-left-color: rgb(0, 0, 136); border-left-style: none; border-left-width: 0p=
x; border-right-color: rgb(0, 0, 136); border-right-style: none; border-rig=
ht-width: 0px; border-top-color: rgb(0, 0, 136); border-top-style: none; bo=
rder-top-width: 0px; color: rgb(0, 0, 136); margin-bottom: 0px; margin-left=
: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px;">end</span><span style=3D"bor=
der-bottom-color: rgb(102, 102, 0); border-bottom-style: none; border-botto=
m-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-=
image-slice: 100%; border-image-source: none; border-image-width: 1; border=
-left-color: rgb(102, 102, 0); border-left-style: none; border-left-width: =
0px; border-right-color: rgb(102, 102, 0); border-right-style: none; border=
-right-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: no=
ne; border-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; mar=
gin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pad=
ding-left: 0px; padding-right: 0px; padding-top: 0px;">(),</span><span styl=
e=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-b=
ottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bor=
der-image-slice: 100%; border-image-source: none; border-image-width: 1; bo=
rder-left-color: rgb(0, 0, 0); border-left-style: none; border-left-width: =
0px; border-right-color: rgb(0, 0, 0); border-right-style: none; border-rig=
ht-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; bord=
er-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0p=
x; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0=
px; padding-right: 0px; padding-top: 0px;"> </span><span style=3D"border-bo=
ttom-color: rgb(0, 0, 136); border-bottom-style: none; border-bottom-width:=
 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sl=
ice: 100%; border-image-source: none; border-image-width: 1; border-left-co=
lor: rgb(0, 0, 136); border-left-style: none; border-left-width: 0px; borde=
r-right-color: rgb(0, 0, 136); border-right-style: none; border-right-width=
: 0px; border-top-color: rgb(0, 0, 136); border-top-style: none; border-top=
-width: 0px; color: rgb(0, 0, 136); margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px;">if</span><span style=3D"border-botto=
m-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-width: =
0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sli=
ce: 100%; border-image-source: none; border-image-width: 1; border-left-col=
or: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; bord=
er-right-color: rgb(102, 102, 0); border-right-style: none; border-right-wi=
dth: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; borde=
r-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left:=
 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left=
: 0px; padding-right: 0px; padding-top: 0px;">:</span><span style=3D"border=
-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width=
: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-s=
lice: 100%; border-image-source: none; border-image-width: 1; border-left-c=
olor: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; border=
-right-color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0=
px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-widt=
h: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-r=
ight: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding=
-right: 0px; padding-top: 0px;"> functor</span><span style=3D"border-bottom=
-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-width: 0=
px; border-image-outset: 0; border-image-repeat: stretch; border-image-slic=
e: 100%; border-image-source: none; border-image-width: 1; border-left-colo=
r: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; borde=
r-right-color: rgb(102, 102, 0); border-right-style: none; border-right-wid=
th: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; border=
-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: =
0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left:=
 0px; padding-right: 0px; padding-top: 0px;">);</span><span style=3D"border=
-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width=
: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-s=
lice: 100%; border-image-source: none; border-image-width: 1; border-left-c=
olor: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; border=
-right-color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0=
px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-widt=
h: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-r=
ight: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding=
-right: 0px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb(0, 0,=
 0); border-bottom-style: none; border-bottom-width: 0px; border-image-outs=
et: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image=
-source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); bord=
er-left-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, =
0); border-right-style: none; border-right-width: 0px; border-top-color: rg=
b(0, 0, 0); border-top-style: none; border-top-width: 0px; margin-bottom: 0=
px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></span></code=
></span></div></code></div><br style=3D"border-bottom-color: rgb(34, 34, 34=
); border-bottom-style: none; border-bottom-width: 0px; border-image-outset=
: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-s=
ource: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bor=
der-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 3=
4, 34); border-right-style: none; border-right-width: 0px; border-top-color=
: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rg=
b(34, 34, 34); line-height: normal; margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px;">I personally prefer the third one (I=
 would like it even more with ranges).</div><div style=3D"border-bottom-col=
or: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; b=
order-image-outset: 0; border-image-repeat: stretch; border-image-slice: 10=
0%; border-image-source: none; border-image-width: 1; border-left-color: rg=
b(34, 34, 34); border-left-style: none; border-left-width: 0px; border-righ=
t-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px=
; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-wid=
th: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-to=
p: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px;">This is not really about the possibility to do it now, but how =
the syntax looks.<br style=3D"border-bottom-color: rgb(34, 34, 34); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(34, =
34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, =
34); line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-righ=
t: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-ri=
ght: 0px; padding-top: 0px;"></div><div style=3D"border-bottom-color: rgb(3=
4, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34,=
 34); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; =
margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
;"><br style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bo=
rder-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-sty=
le: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); borde=
r-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); line-heig=
ht: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;"></div><div style=3D"border-bottom-color: rgb(34, 34, 34); bo=
rder-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; =
border-image-repeat: stretch; border-image-slice: 100%; border-image-source=
: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-l=
eft-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom:=
 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom:=
 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Overall I w=
ant to clarify: that&#39;s my opinion, and I&#39;m pretty sure some will di=
sagree, but I really think it is worth pursuing.=C2=A0</div></div></blockqu=
ote></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/845a4efd-e98e-4329-a934-8d4d358f3ec0%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/845a4efd-e98e-4329-a934-8d4d358f3ec0=
%40isocpp.org</a>.<br />

------=_Part_277_691418504.1533223386269--

------=_Part_276_1194583652.1533223386267--

.


Author: florian.csdt@gmail.com
Date: Thu, 2 Aug 2018 08:58:01 -0700 (PDT)
Raw View
------=_Part_327_920319256.1533225481859
Content-Type: multipart/alternative;
 boundary="----=_Part_328_607291593.1533225481861"

------=_Part_328_607291593.1533225481861
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable



Le jeudi 2 ao=C3=BBt 2018 17:23:06 UTC+2, mihailn...@gmail.com a =C3=A9crit=
 :
>
> *Quote=20
> from https://groups.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7Nrwn=
GQ/czTCvTkSDQAJ=20
> <https://groups.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/c=
zTCvTkSDQAJ>*
> =20
>
>> I was thinking about this one:=20
>> https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLu=
tWGp4I=20
>>
>> So let me tell you what I was thinking:
>>
>> There exist a common, yet unutterable, where tag types live (lets call i=
t=20
>> tag_ns to simplify).
>>
>> When you declare a function with tags:
>> int foo(tag_name: float f);
>> The compiler creates a tag type in this namespace called tag_name, and=
=20
>> transform the declaration like that:
>> int foo(tag_ns::tag_name, float f);
>>
>> When you call a function with a tag:
>> foo(tag_name: 1.f);
>> The compiler creates a tag type in this namespace called tag_name,=20
>> replaces the expression with a call like that (without even needing to k=
now=20
>> the declaration of the function):
>> foo(tag_ns::tag_name{}, 1.f);
>>
>> If two functions (even in different namespaces) use the same tag name,=
=20
>> they will have the same tag type, which is fine.
>>
>
> Yes, initially I was thinking names are names no matter the namespace, bu=
t=20
> I abandoned this.
>
> I abandoned it because tags are types, and are used for overload=20
> resolution. If the std has a tag named 'par' and I want to use this name=
=20
> but with different implementation, I must be able to do that, much like=
=20
> today
> We need namespaces for tags, and,  to the very least labels should be=20
> defined in the namespace of the functions.
>

The tag has no implementation, only the overload using the tag has an=20
implementation. So there is absolutely no problem here.
void foo(tag:);
void bar(tag:);

Why tag in both cases couldn't be the same? We use nothing from those tag=
=20
objects.

How many real world code use non-empty classes as tags?
=20

>
> But then I also abended automatic introduction...
>
=20
>
>> ...
>>
>> The main feature here would be the automatic introduction of types. A bi=
t=20
>> like a template instantiation. It is implicit.
>>
>
> Automatic introduction is not that good of a barging - we invent new rule=
s=20
> to save some typing, but new problems arise.=20
>

What are those problems ?
If tag: refers to a single type wherever you are (even across TUs), then=20
what is the problem?
=20

>
> Where are tags created? How can we make them template? How can we add=20
> attributes to them? Is this really new signature?
>

First, I was thinking in an unutterable namespace, yet common to all TUs.
But then, making them an instantiation of std::tag<"tag_name"> might be=20
better.

You don't add attributes to them because you don't need to. Do you add=20
attributes to the definition of std::string?
=20

>
> *Sidenote*, how do you name the type to create a function signature?=20
> decltype(name:)? name: to mean different things in different contexts?=20
> Things escalate quickly.=20
>

When you declare a function, you would do:
void foo(tag_name:);
// or
// void foo(std::tag<"tag_name">);

That's true name: would have different meaning depending on the context,=20
but that's would be the case anyway because of labels.
And actually, when declaring a function and when using it, they don't mean=
=20
the same language construct, but still have a common meaning: they are tags=
..
So only the translation would be different, not the meaning.

Actually, with decltype(name:), whatever the translation of name: would be=
=20
(type or object of that type), the result is still the same.

=20

>
> In the end, I made it all as conservative as possible and as much based o=
n=20
> current practice as possible. The initial simplicity was deceiving, becau=
se=20
> it was just a morning idea.
>

On the contrary, the initial simplicity was great. I think you shouldn't=20
have tried to solve its issues by making more complex, but on the contrary=
=20
making it more simple (like I did).
=20

>
> This is not to say we could not use some shortcut syntax.
>
> We could
>
> int foo(tag_name: float f);
>
> generate
>
> case struct tag_name; //< enclosing scope
> int foo(case tag_name, float f);
>
> But I still question the pros/cons ratio.=20
>
>
>
>
>> In your first proposal, you mentioned you wanted to be able to do=20
>> something like that:
>> any(in_place<string>: "");
>> I don't think it is useful. you are not naming an argument here.
>>
>
> In *most* cases tags are used it is not as if the argument is named.=20
>

True, tags are not names.
Avoiding this use case makes the design very simple.
Much simpler than all the alternatives you tried.
=20

>
> Here it says "*string arguments here:*" and for that colon is=20
> grammatically correct.
>
>
> Also not naming an argument, but still grammatically correct:
>
> shared_lock( defer_lock: mtx);=20
> shared_lock( try_to_lock: mtx);
> shared_lock( adopt_lock: mtx);
>
> As in "...*the lock of: [the mutex]*"
>
>
>> Now, to be fair, you could do something equivalent in C++20:
>> int foo(std::tag<"tag_name">, float f);
>>
>> foo("tag_name"tag, 1.f);
>>
>> But the shorthand syntax would be very nice.
>> Moreover, such a shorthand syntax would give people incentives to use it=
=20
>> (I consider it a good thing).
>> Let's make a quick poll. Which one do you prefer? (try to see it as a=20
>> newcomer to the language)
>> std::find_if(v.begin(), v.end(), functor);
>> std::find(v.begin(), v.end(), "if"tag, functor);
>> std::find(v.begin(), v.end(), if: functor);
>>
>> I personally prefer the third one (I would like it even more with ranges=
).
>> This is not really about the possibility to do it now, but how the synta=
x=20
>> looks.
>>
>> Overall I want to clarify: that's my opinion, and I'm pretty sure some=
=20
>> will disagree, but I really think it is worth pursuing.=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.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/05542990-b549-4527-9320-eb676284ba4f%40isocpp.or=
g.

------=_Part_328_607291593.1533225481861
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>Le jeudi 2 ao=C3=BBt 2018 17:23:06 UTC+2, mihailn.=
...@gmail.com a =C3=A9crit=C2=A0:<blockquote class=3D"gmail_quote" style=3D"=
margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;=
"><div dir=3D"ltr"><div><b>Quote from=C2=A0<a href=3D"https://groups.google=
..com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/czTCvTkSDQAJ" target=3D"_=
blank" rel=3D"nofollow" onmousedown=3D"this.href=3D&#39;https://groups.goog=
le.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/czTCvTkSDQAJ&#39;;retur=
n true;" onclick=3D"this.href=3D&#39;https://groups.google.com/a/isocpp.org=
/d/msg/std-proposals/wz0a7NrwnGQ/czTCvTkSDQAJ&#39;;return true;">https://gr=
oups.google.<wbr>com/a/isocpp.org/d/msg/std-<wbr>proposals/wz0a7NrwnGQ/<wbr=
>czTCvTkSDQAJ</a></b></div><div>=C2=A0</div><blockquote class=3D"gmail_quot=
e" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb=
(204,204,204);border-left-width:1px;border-left-style:solid"><div>I was thi=
nking about this one: <a style=3D"border-bottom-color:rgb(17,85,204);border=
-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(17,85,204)=
;border-left-style:none;border-left-width:0px;border-right-color:rgb(17,85,=
204);border-right-style:none;border-right-width:0px;border-top-color:rgb(17=
,85,204);border-top-style:none;border-top-width:0px;color:rgb(17,85,204);ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bot=
tom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-decoration:=
none" href=3D"https://groups.google.com/a/isocpp.org/forum/#!topic/std-prop=
osals/O6rLutWGp4I" rel=3D"nofollow" target=3D"_blank" onmousedown=3D"this.h=
ref=3D&#39;https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposa=
ls/O6rLutWGp4I&#39;;return true;" onclick=3D"this.href=3D&#39;https://group=
s.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I&#39;;retu=
rn true;">https://groups.google.com/a/<wbr>isocpp.org/forum/#!topic/std-<wb=
r>proposals/O6rLutWGp4I</a> <br style=3D"border-bottom-color:rgb(34,34,34);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,3=
4,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(3=
4,34,34);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34);=
line-height:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margi=
n-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top=
:0px"></div><div><br style=3D"border-bottom-color:rgb(34,34,34);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);borde=
r-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34)=
;border-top-style:none;border-top-width:0px;color:rgb(34,34,34);line-height=
:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;p=
adding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></div=
><div>So let me tell you what I was thinking:</div><div><br style=3D"border=
-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0p=
x;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:=
0px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-w=
idth:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-wi=
dth:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;margin-lef=
t:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;p=
adding-right:0px;padding-top:0px"></div><div>There exist a common, yet unut=
terable, where tag types live (lets call it tag_ns to simplify).</div><div>=
<br style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none=
;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:=
none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style=
:none;border-top-width:0px;color:rgb(34,34,34);line-height:normal;margin-bo=
ttom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px=
;padding-left:0px;padding-right:0px;padding-top:0px"></div><div>When you de=
clare a function with tags:</div><div><div style=3D"background-color:rgb(25=
0,250,250);border-bottom-color:rgb(187,187,187);border-bottom-style:solid;b=
order-bottom-width:1px;border-left-color:rgb(187,187,187);border-left-style=
:solid;border-left-width:1px;border-right-color:rgb(187,187,187);border-rig=
ht-style:solid;border-right-width:1px;border-top-color:rgb(187,187,187);bor=
der-top-style:solid;border-top-width:1px;margin-bottom:0px;margin-left:0px;=
margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding=
-right:0px;padding-top:0px"><code style=3D"border-bottom-color:rgb(34,34,34=
);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34=
,34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb=
(34,34,34);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;=
margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-=
left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bottom-col=
or:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-le=
ft-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;bo=
rder-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px"><span style=3D"b=
order-bottom-color:rgb(0,0,136);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(0,0,136);border-left-style:none;border-left-wid=
th:0px;border-right-color:rgb(0,0,136);border-right-style:none;border-right=
-width:0px;border-top-color:rgb(0,0,136);border-top-style:none;border-top-w=
idth:0px;color:rgb(0,0,136);margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px">int</span><span style=3D"border-bottom-color:rgb(0,0,0);bord=
er-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);b=
order-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);b=
order-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0p=
x;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddin=
g-left:0px;padding-right:0px;padding-top:0px"> foo</span><span style=3D"bor=
der-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(102,102,0);border-left-style:none;border-left-w=
idth:0px;border-right-color:rgb(102,102,0);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(102,102,0);border-top-style:none;border=
-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margi=
n-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-righ=
t:0px;padding-top:0px">(</span><span style=3D"border-bottom-color:rgb(0,0,0=
);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,=
0,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(0,=
0,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(0,=
0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bot=
tom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px">tag_name</span><span st=
yle=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:n=
one;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px">:</span><span style=3D"border-bottom-color=
:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-co=
lor:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-co=
lor:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-co=
lor:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"> </span><span=
 style=3D"border-bottom-color:rgb(0,0,136);border-bottom-style:none;border-=
bottom-width:0px;border-left-color:rgb(0,0,136);border-left-style:none;bord=
er-left-width:0px;border-right-color:rgb(0,0,136);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,136);border-top-style:none;b=
order-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px">float</span><span style=3D"border-bottom-color:rg=
b(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-color=
:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px"> f</span><span s=
tyle=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-=
bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:no=
ne;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:=
none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-lef=
t:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;p=
adding-right:0px;padding-top:0px">);</span><span style=3D"border-bottom-col=
or:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-=
color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-=
color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-=
color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0=
);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span>=
</div></code></div>The compiler creates a tag type in this namespace called=
 tag_name, and transform the declaration like that:</div><div><div style=3D=
"background-color:rgb(250,250,250);border-bottom-color:rgb(187,187,187);bor=
der-bottom-style:solid;border-bottom-width:1px;border-left-color:rgb(187,18=
7,187);border-left-style:solid;border-left-width:1px;border-right-color:rgb=
(187,187,187);border-right-style:solid;border-right-width:1px;border-top-co=
lor:rgb(187,187,187);border-top-style:solid;border-top-width:1px;margin-bot=
tom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px"><code style=3D"border-b=
ottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div st=
yle=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;borde=
r-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;=
border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px"><span style=3D"border-bottom-color:rgb(0,0,136);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(0,0,136);border-left-st=
yle:none;border-left-width:0px;border-right-color:rgb(0,0,136);border-right=
-style:none;border-right-width:0px;border-top-color:rgb(0,0,136);border-top=
-style:none;border-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;margi=
n-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:=
0px;padding-right:0px;padding-top:0px">int</span><span style=3D"border-bott=
om-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border=
-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;borde=
r-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb=
(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;p=
adding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"> foo<=
/span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-=
style:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);bord=
er-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px">(</span><span style=3D"borde=
r-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px=
;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;col=
or:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top=
:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"=
>tag_ns</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);bord=
er-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(102,102=
,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px">::</span><span style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;m=
argin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding=
-top:0px">tag_name</span><span style=3D"border-bottom-color:rgb(102,102,0);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,=
102,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
102,102,0);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102=
,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">,</span><=
span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;borde=
r-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bord=
er-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bor=
der-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;borde=
r-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px"> </span><span style=3D"border-bottom-color:rgb(0,0,136)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0=
,136);border-left-style:none;border-left-width:0px;border-right-color:rgb(0=
,0,136);border-right-style:none;border-right-width:0px;border-top-color:rgb=
(0,0,136);border-top-style:none;border-top-width:0px;color:rgb(0,0,136);mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px">float</span><spa=
n style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-=
left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border=
-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-t=
op-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px"> f</span><span style=3D"border-bottom-color:rgb(102,102,0)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102=
,102,0);border-left-style:none;border-left-width:0px;border-right-color:rgb=
(102,102,0);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,10=
2,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">);</span=
><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bor=
der-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border=
-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border=
-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border=
-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;marg=
in-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-rig=
ht:0px;padding-top:0px"></span></div></code></div></div><div><br style=3D"b=
order-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-wid=
th:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-w=
idth:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-t=
op-width:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;margi=
n-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:=
0px;padding-right:0px;padding-top:0px"></div><div>When you call a function =
with a tag:</div><div><div style=3D"background-color:rgb(250,250,250);borde=
r-bottom-color:rgb(187,187,187);border-bottom-style:solid;border-bottom-wid=
th:1px;border-left-color:rgb(187,187,187);border-left-style:solid;border-le=
ft-width:1px;border-right-color:rgb(187,187,187);border-right-style:solid;b=
order-right-width:1px;border-top-color:rgb(187,187,187);border-top-style:so=
lid;border-top-width:1px;margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px"><code style=3D"border-bottom-color:rgb(34,34,34);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-l=
eft-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bo=
rder-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;=
margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding=
-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,=
34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
34,34,34);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-l=
eft:0px;padding-right:0px;padding-top:0px"><span style=3D"border-bottom-col=
or:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-=
color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-=
color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-=
color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0=
);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">foo</span><=
span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;b=
order-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(102,102,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-=
style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;marg=
in-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left=
:0px;padding-right:0px;padding-top:0px">(</span><span style=3D"border-botto=
m-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(=
0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">tag_na=
me</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-le=
ft-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);b=
order-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px">:</span><span style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px"> </span><span style=3D"border-bottom-color:rgb(0,102,102);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(0,102,102);border=
-left-style:none;border-left-width:0px;border-right-color:rgb(0,102,102);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(0,102,102=
);border-top-style:none;border-top-width:0px;color:rgb(0,102,102);margin-bo=
ttom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px=
;padding-left:0px;padding-right:0px;padding-top:0px">1.f</span><span style=
=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:none=
;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px">);</span><span style=3D"border-bottom-color:r=
gb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-colo=
r:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-colo=
r:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bot=
tom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span></div>=
</code></div></div><div>The
 compiler creates a tag type in this namespace called tag_name, replaces
 the expression with a call like that (without even needing to know the=20
declaration of the function):</div><div><div style=3D"background-color:rgb(=
250,250,250);border-bottom-color:rgb(187,187,187);border-bottom-style:solid=
;border-bottom-width:1px;border-left-color:rgb(187,187,187);border-left-sty=
le:solid;border-left-width:1px;border-right-color:rgb(187,187,187);border-r=
ight-style:solid;border-right-width:1px;border-top-color:rgb(187,187,187);b=
order-top-style:solid;border-top-width:1px;margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px"><code style=3D"border-bottom-color:rgb(34,34,=
34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(=
34,34,34);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(34,34,34);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0p=
x;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddin=
g-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bottom-c=
olor:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><span style=3D=
"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width=
:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0=
px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">foo</span><span style=3D"border-bottom-color:rgb(102,102,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,=
0);border-right-style:none;border-right-width:0px;border-top-color:rgb(102,=
102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px">(</span><span sty=
le=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom=
-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-=
width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-righ=
t-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-wi=
dth:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px">tag_ns</span><span style=3D"border-bottom-color:rgb(102,102,0);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,=
102,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
102,102,0);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102=
,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">::</span>=
<span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bord=
er-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-=
right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:=
0px;padding-top:0px">tag_name</span><span style=3D"border-bottom-color:rgb(=
102,102,0);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-right=
-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:=
rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
">{},</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-st=
yle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-s=
tyle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-sty=
le:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px"> </span><span style=3D"border-bottom-color=
:rgb(0,102,102);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(0,102,102);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(0,102,102);border-right-style:none;border-right-width:0px;b=
order-top-color:rgb(0,102,102);border-top-style:none;border-top-width:0px;c=
olor:rgb(0,102,102);margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">1.f</span><span style=3D"border-bottom-color:rgb(102,102,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,=
0);border-right-style:none;border-right-width:0px;border-top-color:rgb(102,=
102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px">);</span><span st=
yle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left=
-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-rig=
ht-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-w=
idth:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-styl=
e:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px"></span></div></code></div><br style=3D"border-bottom-color:r=
gb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:r=
gb(34,34,34);line-height:normal;margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px">If two functions (even in different namespaces) use the =
same tag name, they will have the same tag type, which is fine.</div></bloc=
kquote><div><br></div><div>Yes, initially I was thinking names are names no=
 matter the namespace, but I <span style=3D"display:inline!important;float:=
none;background-color:transparent;color:rgb(34,34,34);font-family:&quot;Ari=
al&quot;,&quot;Helvetica&quot;,sans-serif;font-size:13px;font-style:normal;=
font-variant:normal;font-weight:400;letter-spacing:normal;text-align:left;t=
ext-decoration:none;text-indent:0px;text-transform:none;white-space:normal;=
word-spacing:0px">abandoned </span>this.</div><div><br></div><div>I abandon=
ed it because tags are types, and are used for overload resolution. If the =
std has a tag named &#39;par&#39; and I want to use this name but with diff=
erent implementation, I must be able to do that, much like today</div><div>=
We need namespaces for tags, and,=C2=A0 to the very least labels should be =
defined in the namespace of the functions.</div></div></blockquote><div><br=
></div><div>The tag has no implementation, only the overload using the tag =
has an implementation. So there is absolutely no problem here.</div><div><d=
iv style=3D"background-color: rgb(250, 250, 250); border-color: rgb(187, 18=
7, 187); border-style: solid; border-width: 1px; overflow-wrap: break-word;=
" class=3D"prettyprint"><code class=3D"prettyprint"><div class=3D"subpretty=
print"><span style=3D"color: #008;" class=3D"styled-by-prettify">void</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify"> foo</span><span=
 style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify">tag</span><span style=3D"color:=
 #660;" class=3D"styled-by-prettify">:);</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify"><br></span><span style=3D"color: #008;" class=
=3D"styled-by-prettify">void</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> bar</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">(</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y">tag</span><span style=3D"color: #660;" class=3D"styled-by-prettify">:);<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></span>=
</div></code></div></div><div><br></div><div>Why tag in both cases couldn&#=
39;t be the same? We use nothing from those tag objects.</div><div><br></di=
v><div>How many real world code use non-empty classes as tags?<br></div><di=
v>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-l=
eft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"=
><div><br></div><div>But then I also abended automatic introduction...<br><=
/div></div></blockquote><blockquote class=3D"gmail_quote" style=3D"margin: =
0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div d=
ir=3D"ltr"><div></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" st=
yle=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,=
204,204);border-left-width:1px;border-left-style:solid"><div>...</div><div>=
<div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bo=
rder-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:non=
e;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style=
:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-styl=
e:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px"><br style=3D"border-bottom-color:rgb(34,34,34);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-=
left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bord=
er-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);b=
order-top-style:none;border-top-width:0px;color:rgb(34,34,34);line-height:n=
ormal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></div><=
div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none=
;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:=
none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style=
:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px">The main feature here would be the automatic introduction of =
types. A bit like a template instantiation. It is implicit.<br style=3D"bor=
der-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width=
:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-wid=
th:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-righ=
t-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top=
-width:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px"></div></div></blockquote><div><br></di=
v><div>Automatic introduction is not that good of a barging - we invent new=
 rules to save some typing, but new problems arise.=C2=A0</div></div></bloc=
kquote><div><br></div><div>What are those problems ?</div><div>If tag: refe=
rs to a single type wherever you are (even across TUs), then what is the pr=
oblem?<br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D=
"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex=
;"><div dir=3D"ltr"><div><br></div><div>Where are tags created? How can we =
make them template? How can we add attributes to them? Is this really new s=
ignature?</div></div></blockquote><div><br></div><div>First, I was thinking=
 in an unutterable namespace, yet common to all TUs.</div><div>But then, ma=
king them an instantiation of std::tag&lt;&quot;tag_name&quot;&gt; might be=
 better.<br></div><div><br></div><div>You don&#39;t add attributes to them =
because you don&#39;t need to. Do you add attributes to the definition of s=
td::string?<br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" sty=
le=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left=
: 1ex;"><div dir=3D"ltr"><div><br></div><div><b>Sidenote</b>, how do you na=
me the type to create a function signature?<font face=3D"courier new,monosp=
ace"> decltype(name:)</font>? <font face=3D"courier new,monospace">name:</f=
ont> to mean different things in different contexts? Things escalate quickl=
y.=C2=A0</div></div></blockquote><div><br></div><div>When you declare a fun=
ction, you would do:</div><div><div style=3D"background-color: rgb(250, 250=
, 250); border-color: rgb(187, 187, 187); border-style: solid; border-width=
: 1px; overflow-wrap: break-word;" class=3D"prettyprint"><code class=3D"pre=
ttyprint"><div class=3D"subprettyprint"><span style=3D"color: #008;" class=
=3D"styled-by-prettify">void</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> foo</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">(</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y">tag_name</span><span style=3D"color: #660;" class=3D"styled-by-prettify"=
>:);</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></=
span><span style=3D"color: #800;" class=3D"styled-by-prettify">// or</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span =
style=3D"color: #800;" class=3D"styled-by-prettify">// void foo(std::tag&lt=
;&quot;tag_name&quot;&gt;);</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"><br></span></div></code></div><br></div><div>That&#39;s tr=
ue <span style=3D"font-family: courier new, monospace;">name:</span> would =
have different meaning depending on the context, but that&#39;s would be th=
e case anyway because of labels.</div><div>And actually, when declaring a f=
unction and when using it, they don&#39;t mean the same language construct,=
 but still have a common meaning: they are tags.</div><div>So only the tran=
slation would be different, not the meaning.</div><div><br></div><div>Actua=
lly, with <span style=3D"font-family: courier new, monospace;">decltype(nam=
e:)</span>, whatever the translation of <span style=3D"font-family: courier=
 new, monospace;">name:</span> would be (type or object of that type), the =
result is still the same.<br></div><div><br></div><div>=C2=A0</div><blockqu=
ote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left=
: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><br></div><div>I=
n the end, I made it all as conservative as possible and as much based on c=
urrent practice as possible. The initial simplicity was deceiving, because =
it was just a morning idea.</div></div></blockquote><div><br></div><div>On =
the contrary, the initial simplicity was great. I think you shouldn&#39;t h=
ave tried to solve its issues by making more complex, but on the contrary m=
aking it more simple (like I did).<br></div><div>=C2=A0</div><blockquote cl=
ass=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px =
#ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><br></div><div>This is=
 not to say we could not use some shortcut syntax.</div><div><br></div><div=
>We could</div><div><br></div><font face=3D"courier new,monospace">int foo(=
tag_name: float f);</font><div><br></div><div>generate</div><div><br></div>=
<div><span style=3D"text-align:left;color:rgb(34,34,34);text-transform:none=
;text-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal;fon=
t-variant:normal;font-weight:400;text-decoration:none;word-spacing:0px;disp=
lay:inline!important;white-space:normal;float:none;background-color:transpa=
rent"><font face=3D"courier new,monospace">case struct tag_name; //&lt; enc=
losing scope</font></span><b></b><i></i><u></u><sub></sub><sup></sup><strik=
e></strike><br></div><div><font face=3D"courier new,monospace">i<span style=
=3D"text-align:left;color:rgb(34,34,34);text-transform:none;text-indent:0px=
;letter-spacing:normal;font-size:13px;font-style:normal;font-variant:normal=
;font-weight:400;text-decoration:none;word-spacing:0px;display:inline!impor=
tant;white-space:normal;float:none;background-color:transparent">nt foo(cas=
e tag_name, float f);</span></font></div><div><font face=3D"courier new,mon=
ospace"><span style=3D"text-align:left;color:rgb(34,34,34);text-transform:n=
one;text-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal;=
font-variant:normal;font-weight:400;text-decoration:none;word-spacing:0px;d=
isplay:inline!important;white-space:normal;float:none;background-color:tran=
sparent"><br></span></font></div><div><span style=3D"text-align:left;color:=
rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:normal;fon=
t-size:13px;font-style:normal;font-variant:normal;font-weight:400;text-deco=
ration:none;word-spacing:0px;display:inline!important;white-space:normal;fl=
oat:none;background-color:transparent"><font face=3D"arial,sans-serif">But =
I still question the pros/cons ratio.=C2=A0</font></span></div><div><font f=
ace=3D"courier new,monospace"></font><br></div><div><b></b><i></i><u></u><s=
ub></sub><sup></sup><strike></strike><font face=3D"courier new,monospace"><=
/font><br></div><div><br></div><blockquote class=3D"gmail_quote" style=3D"m=
argin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204)=
;border-left-width:1px;border-left-style:solid"><div><div style=3D"border-b=
ottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></div><=
div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none=
;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:=
none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style=
:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px"><br style=3D"border-bottom-color:rgb(34,34,34);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-l=
eft-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bo=
rder-top-style:none;border-top-width:0px;color:rgb(34,34,34);line-height:no=
rmal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></div><d=
iv style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;=
border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:n=
one;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:=
none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px">In your first proposal, you mentioned you wanted to be able to=
 do something like that:</div><div style=3D"border-bottom-color:rgb(34,34,3=
4);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(3=
4,34,34);border-left-style:none;border-left-width:0px;border-right-color:rg=
b(34,34,34);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px=
;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding=
-left:0px;padding-right:0px;padding-top:0px"><div style=3D"background-color=
:rgb(250,250,250);border-bottom-color:rgb(187,187,187);border-bottom-style:=
solid;border-bottom-width:1px;border-left-color:rgb(187,187,187);border-lef=
t-style:solid;border-left-width:1px;border-right-color:rgb(187,187,187);bor=
der-right-style:solid;border-right-width:1px;border-top-color:rgb(187,187,1=
87);border-top-style:solid;border-top-width:1px;margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px"><code style=3D"border-bottom-color:rgb(3=
4,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-co=
lor:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bot=
tom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bo=
rder-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;=
border-right-color:rgb(34,34,34);border-right-style:none;border-right-width=
:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:=
0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><span sty=
le=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom=
-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-=
width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-righ=
t-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-wi=
dth:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px">any</span><span style=3D"border-bottom-color:rgb(102,102,0);bor=
der-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102=
,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(102=
,102,0);border-right-style:none;border-right-width:0px;border-top-color:rgb=
(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0)=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">(</span><spa=
n style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-=
left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border=
-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-t=
op-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px">in_place</span><span style=3D"border-bottom-color:rgb(0,13=
6,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb=
(0,136,0);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(0,136,0);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(0,136,0);border-top-style:none;border-top-width:0px;color:rgb(0,136,0)=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">&lt;string&g=
t;</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-le=
ft-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);b=
order-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px">:</span><span style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px"> </span><span style=3D"border-bottom-color:rgb(0,136,0);border-bottom-s=
tyle:none;border-bottom-width:0px;border-left-color:rgb(0,136,0);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(0,136,0);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(0,136,0);border=
-top-style:none;border-top-width:0px;color:rgb(0,136,0);margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-l=
eft:0px;padding-right:0px;padding-top:0px">&quot;&quot;</span><span style=
=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:none=
;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px">);</span><span style=3D"border-bottom-color:r=
gb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-colo=
r:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-colo=
r:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bot=
tom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span></div>=
</code></div>I don&#39;t think it is useful. you are not naming an argument=
 here.</div></div></blockquote><div><br></div><div>In <i>most</i> cases tag=
s are used it is not as if the argument is named.=C2=A0</div></div></blockq=
uote><div><br></div><div>True, tags are not names.</div><div>Avoiding this =
use case makes the design very simple.</div><div>Much simpler than all the =
alternatives you tried.</div><div>=C2=A0</div><blockquote class=3D"gmail_qu=
ote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padd=
ing-left: 1ex;"><div dir=3D"ltr"><div><br></div><div>Here it says &quot;<i>=
string arguments here<b>:</b></i>&quot; and for that colon is grammatically=
 correct.<br></div><div><span><br></span></div><div><span><br></span></div>=
<div>Also not naming an argument, but still grammatically correct:</div><di=
v><br><font face=3D"courier new,monospace">shared_lock( defer_lock: mtx);=
=C2=A0<br>shared_lock( try_to_lock: mtx);<br></font></div><div><font face=
=3D"courier new,monospace">shared_lock( adopt_lock: mtx);</font></div><div>=
<br></div><div>As in &quot;...<i>the lock of<b>:</b> [the mutex]</i>&quot;<=
/div><div><span><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike=
><br></span><span></span></div><blockquote class=3D"gmail_quote" style=3D"m=
argin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204)=
;border-left-width:1px;border-left-style:solid"><div><div style=3D"border-b=
ottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><b></b>=
<i></i><u></u><sub></sub><sup></sup><strike></strike><br style=3D"border-bo=
ttom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px=
;border-right-color:rgb(34,34,34);border-right-style:none;border-right-widt=
h:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width=
:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;margin-left:0=
px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padd=
ing-right:0px;padding-top:0px"></div><div style=3D"border-bottom-color:rgb(=
34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-colo=
r:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-c=
olor:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-to=
p-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bot=
tom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px">Now, to be fair, you co=
uld do something equivalent in C++20:</div><div style=3D"border-bottom-colo=
r:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;bor=
der-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div style=3D"bac=
kground-color:rgb(250,250,250);border-bottom-color:rgb(187,187,187);border-=
bottom-style:solid;border-bottom-width:1px;border-left-color:rgb(187,187,18=
7);border-left-style:solid;border-left-width:1px;border-right-color:rgb(187=
,187,187);border-right-style:solid;border-right-width:1px;border-top-color:=
rgb(187,187,187);border-top-style:solid;border-top-width:1px;margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px"><code style=3D"border-botto=
m-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bord=
er-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;bo=
rder-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0=
px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0p=
x;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px"><span style=3D"border-bottom-color:rgb(0,0,136);border-bottom-style:no=
ne;border-bottom-width:0px;border-left-color:rgb(0,0,136);border-left-style=
:none;border-left-width:0px;border-right-color:rgb(0,0,136);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(0,0,136);border-top-st=
yle:none;border-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;margin-l=
eft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px=
;padding-right:0px;padding-top:0px">int</span><span style=3D"border-bottom-=
color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-le=
ft-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-rig=
ht-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-t=
op-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,=
0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"> foo</sp=
an><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:no=
ne;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-righ=
t-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-=
top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;=
margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-=
left:0px;padding-right:0px;padding-top:0px">(</span><span style=3D"border-b=
ottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bord=
er-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bo=
rder-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:=
rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">st=
d</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);border=
-right-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);bo=
rder-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom=
:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pad=
ding-left:0px;padding-right:0px;padding-top:0px">::</span><span style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px">tag</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);bord=
er-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(102,102=
,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px">&lt;</span><span sty=
le=3D"border-bottom-color:rgb(0,136,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(0,136,0);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(0,136,0);border-right-style:none;borde=
r-right-width:0px;border-top-color:rgb(0,136,0);border-top-style:none;borde=
r-top-width:0px;color:rgb(0,136,0);margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px">&quot;tag_name&quot;</span><span style=3D"border-bott=
om-color:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px;bo=
rder-left-color:rgb(102,102,0);border-left-style:none;border-left-width:0px=
;border-right-color:rgb(102,102,0);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(102,102,0);border-top-style:none;border-top-wid=
th:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px">&gt;,</span><span style=3D"border-bottom-color:rgb(0,0,0);bo=
rder-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0)=
;border-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0)=
;border-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0)=
;border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px"> </span><span style=3D"bord=
er-bottom-color:rgb(0,0,136);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,136);border-left-style:none;border-left-width:=
0px;border-right-color:rgb(0,0,136);border-right-style:none;border-right-wi=
dth:0px;border-top-color:rgb(0,0,136);border-top-style:none;border-top-widt=
h:0px;color:rgb(0,0,136);margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px">float</span><span style=3D"border-bottom-color:rgb(0,0,0);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);bo=
rder-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);bo=
rder-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px=
;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding=
-left:0px;padding-right:0px;padding-top:0px"> f</span><span style=3D"border=
-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(102,102,0);border-left-style:none;border-left-widt=
h:0px;border-right-color:rgb(102,102,0);border-right-style:none;border-righ=
t-width:0px;border-top-color:rgb(102,102,0);border-top-style:none;border-to=
p-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px">);</span><span style=3D"border-bottom-color:rgb(0,0,0);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,=
0);border-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,=
0);border-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,=
0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border-botto=
m-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bot=
tom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border-bot=
tom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-b=
ottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0p=
x;padding-left:0px;padding-right:0px;padding-top:0px">foo</span><span style=
=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:none=
;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px">(</span><span style=3D"border-bottom-color:rg=
b(0,136,0);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(0,136,0);border-left-style:none;border-left-width:0px;border-right-c=
olor:rgb(0,136,0);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(0,136,0);border-top-style:none;border-top-width:0px;color:rgb(0,=
136,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">&quot;=
tag_name&quot;</span><span style=3D"border-bottom-color:rgb(0,0,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);borde=
r-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);borde=
r-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px">tag</span><span style=3D"border-b=
ottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px=
;border-left-color:rgb(102,102,0);border-left-style:none;border-left-width:=
0px;border-right-color:rgb(102,102,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(102,102,0);border-top-style:none;border-top-=
width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-rig=
ht:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px=
;padding-top:0px">,</span><span style=3D"border-bottom-color:rgb(0,0,0);bor=
der-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);=
border-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);=
border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px"> </span><span style=3D"borde=
r-bottom-color:rgb(0,102,102);border-bottom-style:none;border-bottom-width:=
0px;border-left-color:rgb(0,102,102);border-left-style:none;border-left-wid=
th:0px;border-right-color:rgb(0,102,102);border-right-style:none;border-rig=
ht-width:0px;border-top-color:rgb(0,102,102);border-top-style:none;border-t=
op-width:0px;color:rgb(0,102,102);margin-bottom:0px;margin-left:0px;margin-=
right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:=
0px;padding-top:0px">1.f</span><span style=3D"border-bottom-color:rgb(102,1=
02,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rg=
b(102,102,0);border-left-style:none;border-left-width:0px;border-right-colo=
r:rgb(102,102,0);border-right-style:none;border-right-width:0px;border-top-=
color:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(1=
02,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">);<=
/span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:non=
e;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:no=
ne;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:n=
one;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:non=
e;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;m=
argin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-=
right:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);bord=
er-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);b=
order-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);b=
order-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px"></span></div></code></div></div><div style=3D"=
border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-wi=
dth:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-=
width:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-=
top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top=
:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"=
><br style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bo=
rder-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:non=
e;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style=
:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-styl=
e:none;border-top-width:0px;color:rgb(34,34,34);line-height:normal;margin-b=
ottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0p=
x;padding-left:0px;padding-right:0px;padding-top:0px"></div><div style=3D"b=
order-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-wid=
th:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-w=
idth:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-t=
op-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:=
0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">=
But the shorthand syntax would be very nice.</div><div style=3D"border-bott=
om-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(34,34,34);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0=
px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">Moreover, =
such a shorthand syntax would give people incentives to use it (I consider =
it a good thing).</div><div style=3D"border-bottom-color:rgb(34,34,34);bord=
er-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34=
);border-left-style:none;border-left-width:0px;border-right-color:rgb(34,34=
,34);border-right-style:none;border-right-width:0px;border-top-color:rgb(34=
,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin=
-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0=
px;padding-right:0px;padding-top:0px">Let&#39;s make a quick poll. Which on=
e do you prefer? (try to see it as a newcomer to the language)<br style=3D"=
border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-wi=
dth:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-=
width:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-=
top-width:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;marg=
in-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left=
:0px;padding-right:0px;padding-top:0px"></div><div style=3D"border-bottom-c=
olor:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div style=3D"=
background-color:rgb(250,250,250);border-bottom-color:rgb(187,187,187);bord=
er-bottom-style:solid;border-bottom-width:1px;border-left-color:rgb(187,187=
,187);border-left-style:solid;border-left-width:1px;border-right-color:rgb(=
187,187,187);border-right-style:solid;border-right-width:1px;border-top-col=
or:rgb(187,187,187);border-top-style:solid;border-top-width:1px;margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px"><code style=3D"border-bo=
ttom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px=
;border-right-color:rgb(34,34,34);border-right-style:none;border-right-widt=
h:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width=
:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div sty=
le=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bot=
tom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;b=
order-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px"><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:no=
ne;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:=
none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:no=
ne;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;=
margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding=
-right:0px;padding-top:0px">std</span><span style=3D"border-bottom-color:rg=
b(102,102,0);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-rig=
ht-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;colo=
r:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px">::</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-s=
tyle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-st=
yle:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-lef=
t:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;p=
adding-right:0px;padding-top:0px">find_if</span><span style=3D"border-botto=
m-color:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(102,102,0);border-left-style:none;border-left-width:0px;=
border-right-color:rgb(102,102,0);border-right-style:none;border-right-widt=
h:0px;border-top-color:rgb(102,102,0);border-top-style:none;border-top-widt=
h:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px">(</span><span style=3D"border-bottom-color:rgb(0,0,0);border-=
bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);bord=
er-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);bord=
er-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);bord=
er-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-l=
eft:0px;padding-right:0px;padding-top:0px">v</span><span style=3D"border-bo=
ttom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(102,102,0);border-left-style:none;border-left-width:0=
px;border-right-color:rgb(102,102,0);border-right-style:none;border-right-w=
idth:0px;border-top-color:rgb(102,102,0);border-top-style:none;border-top-w=
idth:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px">.</span><span style=3D"border-bottom-color:rgb(0,0,136);bo=
rder-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,13=
6);border-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,=
136);border-right-style:none;border-right-width:0px;border-top-color:rgb(0,=
0,136);border-top-style:none;border-top-width:0px;color:rgb(0,0,136);margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:=
0px;padding-left:0px;padding-right:0px;padding-top:0px">begin</span><span s=
tyle=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-=
bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:no=
ne;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:=
none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-lef=
t:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;p=
adding-right:0px;padding-top:0px">(),</span><span style=3D"border-bottom-co=
lor:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left=
-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right=
-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,=
0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"> v</span><=
span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;b=
order-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(102,102,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-=
style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;marg=
in-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left=
:0px;padding-right:0px;padding-top:0px">.</span><span style=3D"border-botto=
m-color:rgb(0,0,136);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(0,0,136);border-left-style:none;border-left-width:0px;bord=
er-right-color:rgb(0,0,136);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(0,0,136);border-top-style:none;border-top-width:0px;co=
lor:rgb(0,0,136);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px">end</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);bord=
er-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(102,102=
,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px">(),</span><span styl=
e=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-=
width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-w=
idth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right=
-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-wid=
th:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px"> functor</span><span style=3D"border-bottom-color:rgb(102,102,0)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102=
,102,0);border-left-style:none;border-left-width:0px;border-right-color:rgb=
(102,102,0);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,10=
2,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">);</span=
><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bor=
der-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border=
-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border=
-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border=
-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;marg=
in-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-rig=
ht:0px;padding-top:0px">std</span><span style=3D"border-bottom-color:rgb(10=
2,102,0);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-right-c=
olor:rgb(102,102,0);border-right-style:none;border-right-width:0px;border-t=
op-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rg=
b(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:=
0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">=
::</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:=
none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style=
:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-styl=
e:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:=
none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px">find</span><span style=3D"border-bottom-color=
:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;b=
order-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;c=
olor:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">(</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-righ=
t-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-=
style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-l=
eft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px=
;padding-right:0px;padding-top:0px">v</span><span style=3D"border-bottom-co=
lor:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(102,102,0);border-left-style:none;border-left-width:0px;bord=
er-right-color:rgb(102,102,0);border-right-style:none;border-right-width:0p=
x;border-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0p=
x;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;m=
argin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding=
-top:0px">.</span><span style=3D"border-bottom-color:rgb(0,0,136);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,136);bord=
er-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,136);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,136);=
border-top-style:none;border-top-width:0px;color:rgb(0,0,136);margin-bottom=
:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pad=
ding-left:0px;padding-right:0px;padding-top:0px">begin</span><span style=3D=
"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-=
width:0px;border-left-color:rgb(102,102,0);border-left-style:none;border-le=
ft-width:0px;border-right-color:rgb(102,102,0);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:none;bo=
rder-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;m=
argin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-=
right:0px;padding-top:0px">(),</span><span style=3D"border-bottom-color:rgb=
(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:=
rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-color:=
rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px"> v</span><span st=
yle=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:n=
one;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px">.</span><span style=3D"border-bottom-color=
:rgb(0,0,136);border-bottom-style:none;border-bottom-width:0px;border-left-=
color:rgb(0,0,136);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(0,0,136);border-right-style:none;border-right-width:0px;border-=
top-color:rgb(0,0,136);border-top-style:none;border-top-width:0px;color:rgb=
(0,0,136);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">end=
</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);bor=
der-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px">(),</span><span style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px"> </span><span style=3D"border-bottom-color:rgb(0,136,0);border-bottom-s=
tyle:none;border-bottom-width:0px;border-left-color:rgb(0,136,0);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(0,136,0);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(0,136,0);border=
-top-style:none;border-top-width:0px;color:rgb(0,136,0);margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-l=
eft:0px;padding-right:0px;padding-top:0px">&quot;if&quot;</span><span style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;m=
argin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding=
-top:0px">tag</span><span style=3D"border-bottom-color:rgb(102,102,0);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0=
);border-left-style:none;border-left-width:0px;border-right-color:rgb(102,1=
02,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(1=
02,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px">,</span><span =
style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bot=
tom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-le=
ft-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top=
-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px"> functor</span><span style=3D"border-bottom-color:rgb(102,10=
2,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb=
(102,102,0);border-left-style:none;border-left-width:0px;border-right-color=
:rgb(102,102,0);border-right-style:none;border-right-width:0px;border-top-c=
olor:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(10=
2,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;=
padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">);</=
span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none=
;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:non=
e;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:no=
ne;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none=
;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px"><code style=3D"border-bottom-color:rgb(0,0,0);bor=
der-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);=
border-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);=
border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px"><span style=3D"border-bottom-color:rgb(0,0,0)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0=
,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(0,0=
,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(0,0=
,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border-bott=
om-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border=
-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;borde=
r-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bo=
ttom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px=
;padding-left:0px;padding-right:0px;padding-top:0px">std</span><span style=
=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:none=
;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px">::</span><span style=3D"border-bottom-color:r=
gb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-colo=
r:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-colo=
r:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bot=
tom:0px;padding-left:0px;padding-right:0px;padding-top:0px">find</span><spa=
n style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none=
;border-left-width:0px;border-right-color:rgb(102,102,0);border-right-style=
:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-sty=
le:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px">(</span><span style=3D"border-bottom-c=
olor:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-to=
p-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0=
,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">v</span><=
span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;b=
order-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(102,102,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-=
style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;marg=
in-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left=
:0px;padding-right:0px;padding-top:0px">.</span><span style=3D"border-botto=
m-color:rgb(0,0,136);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(0,0,136);border-left-style:none;border-left-width:0px;bord=
er-right-color:rgb(0,0,136);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(0,0,136);border-top-style:none;border-top-width:0px;co=
lor:rgb(0,0,136);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px">begin</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);bo=
rder-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,0=
);border-right-style:none;border-right-width:0px;border-top-color:rgb(102,1=
02,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);margi=
n-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom=
:0px;padding-left:0px;padding-right:0px;padding-top:0px">(),</span><span st=
yle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left=
-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-rig=
ht-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-w=
idth:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px"> v</span><span style=3D"border-bottom-color:rgb(102,102,0);bor=
der-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102=
,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(102=
,102,0);border-right-style:none;border-right-width:0px;border-top-color:rgb=
(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0)=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">.</span><spa=
n style=3D"border-bottom-color:rgb(0,0,136);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(0,0,136);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(0,0,136);border-right-style:none;=
border-right-width:0px;border-top-color:rgb(0,0,136);border-top-style:none;=
border-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;margin-left:0px;m=
argin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-=
right:0px;padding-top:0px">end</span><span style=3D"border-bottom-color:rgb=
(102,102,0);border-bottom-style:none;border-bottom-width:0px;border-left-co=
lor:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;borde=
r-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;color=
:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-t=
op:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0p=
x">(),</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-s=
tyle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-st=
yle:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-lef=
t:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;p=
adding-right:0px;padding-top:0px"> </span><span style=3D"border-bottom-colo=
r:rgb(0,0,136);border-bottom-style:none;border-bottom-width:0px;border-left=
-color:rgb(0,0,136);border-left-style:none;border-left-width:0px;border-rig=
ht-color:rgb(0,0,136);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(0,0,136);border-top-style:none;border-top-width:0px;color:rg=
b(0,0,136);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">if=
</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);bor=
der-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px">:</span><span style=3D"bord=
er-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px=
;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;=
border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0p=
x;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;co=
lor:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
"> functor</span><span style=3D"border-bottom-color:rgb(102,102,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,=
0);border-right-style:none;border-right-width:0px;border-top-color:rgb(102,=
102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px">);</span><span st=
yle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left=
-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-rig=
ht-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-w=
idth:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-styl=
e:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px"></span></code></span></div></code></div><br style=3D"border-=
bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px=
;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0=
px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wi=
dth:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-wid=
th:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px">I personally prefer the third one (I would=
 like it even more with ranges).</div><div style=3D"border-bottom-color:rgb=
(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-=
color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-t=
op-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bo=
ttom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px=
;padding-left:0px;padding-right:0px;padding-top:0px">This is not really abo=
ut the possibility to do it now, but how the syntax looks.<br style=3D"bord=
er-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:=
0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-widt=
h:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-right=
-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-=
width:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;margin-l=
eft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px=
;padding-right:0px;padding-top:0px"></div><div style=3D"border-bottom-color=
:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left=
-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-ri=
ght-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margi=
n-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom=
:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"borde=
r-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width=
:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-w=
idth:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px"></div><div style=3D"border-bottom-color:=
rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-=
color:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-rig=
ht-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;borde=
r-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:=
0px;padding-left:0px;padding-right:0px;padding-top:0px">Overall I want to c=
larify: that&#39;s my opinion, and I&#39;m pretty sure some will disagree, =
but I really think it is worth pursuing.=C2=A0</div></div></blockquote></di=
v></blockquote></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/05542990-b549-4527-9320-eb676284ba4f%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/05542990-b549-4527-9320-eb676284ba4f=
%40isocpp.org</a>.<br />

------=_Part_328_607291593.1533225481861--

------=_Part_327_920319256.1533225481859--

.


Author: mihailnajdenov@gmail.com
Date: Thu, 2 Aug 2018 09:50:03 -0700 (PDT)
Raw View
------=_Part_331_593292463.1533228603333
Content-Type: multipart/alternative;
 boundary="----=_Part_332_1187150111.1533228603335"

------=_Part_332_1187150111.1533228603335
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable



On Thursday, August 2, 2018 at 6:58:01 PM UTC+3, floria...@gmail.com wrote:
>
>
>
> Le jeudi 2 ao=C3=BBt 2018 17:23:06 UTC+2, mihailn...@gmail.com a =C3=A9cr=
it :
>>
>> *Quote=20
>> from https://groups.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7Nrw=
nGQ/czTCvTkSDQAJ=20
>> <https://groups.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/=
czTCvTkSDQAJ>*
>> =20
>>
>>> I was thinking about this one:=20
>>> https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6rL=
utWGp4I=20
>>>
>>> So let me tell you what I was thinking:
>>>
>>> There exist a common, yet unutterable, where tag types live (lets call=
=20
>>> it tag_ns to simplify).
>>>
>>> When you declare a function with tags:
>>> int foo(tag_name: float f);
>>> The compiler creates a tag type in this namespace called tag_name, and=
=20
>>> transform the declaration like that:
>>> int foo(tag_ns::tag_name, float f);
>>>
>>> When you call a function with a tag:
>>> foo(tag_name: 1.f);
>>> The compiler creates a tag type in this namespace called tag_name,=20
>>> replaces the expression with a call like that (without even needing to =
know=20
>>> the declaration of the function):
>>> foo(tag_ns::tag_name{}, 1.f);
>>>
>>> If two functions (even in different namespaces) use the same tag name,=
=20
>>> they will have the same tag type, which is fine.
>>>
>>
>> Yes, initially I was thinking names are names no matter the namespace,=
=20
>> but I abandoned this.
>>
>> I abandoned it because tags are types, and are used for overload=20
>> resolution. If the std has a tag named 'par' and I want to use this name=
=20
>> but with different implementation, I must be able to do that, much like=
=20
>> today
>> We need namespaces for tags, and,  to the very least labels should be=20
>> defined in the namespace of the functions.
>>
>
> =20

> The tag has no implementation, only the overload using the tag has an=20
> implementation. So there is absolutely no problem here.
> void foo(tag:);
> void bar(tag:);
>
> Why tag in both cases couldn't be the same? We use nothing from those tag=
=20
> objects.
>

Tags are used for specialization of functions (parallel library is an=20
example). I must be able to declare tags that are named the same as the std=
=20
ones, yet are different type and will pick my overload, not the std one.=20

If we completely remove namespaces for tags people will be forced to go the=
=20
C-way of naming to be able to create new type under the "same name" -=20
cuda_parallel - to force new overload.
=20

>
> How many real world code use non-empty classes as tags?=20
>
=20
>
>>
>> But then I also abended automatic introduction...
>>
> =20
>>
>>> ...
>>>
>>> The main feature here would be the automatic introduction of types. A=
=20
>>> bit like a template instantiation. It is implicit.
>>>
>>
>> Automatic introduction is not that good of a barging - we invent new=20
>> rules to save some typing, but new problems arise.=20
>>
>
> What are those problems ?
> If tag: refers to a single type wherever you are (even across TUs), then=
=20
> what is the problem?
> =20
>
>>
>> Where are tags created? How can we make them template? How can we add=20
>> attributes to them? Is this really new signature?
>>
>
> First, I was thinking in an unutterable namespace, yet common to all TUs.
> But then, making them an instantiation of std::tag<"tag_name"> might be=
=20
> better.
>
> You don't add attributes to them because you don't need to. Do you add=20
> attributes to the definition of std::string?
> =20
>
>>
>> *Sidenote*, how do you name the type to create a function signature?=20
>> decltype(name:)? name: to mean different things in different contexts?=
=20
>> Things escalate quickly.=20
>>
>
> =20

> When you declare a function, you would do:
> void foo(tag_name:);
> // or
> // void foo(std::tag<"tag_name">);
>
> That's true name: would have different meaning depending on the context,=
=20
> but that's would be the case anyway because of labels.
>

And what about std::function and pointers to functions? We will need to=20
touch a lot of places to enable this syntax. =20

Also note that we will need extra rules what introduces and what just names=
=20
a label. And these are not trivial, we can't always blindly introduce.=20
Makes no sense to introduce a type by declaring a function pointer, even if=
=20
we agree to not have namespaces for them.

=20

> And actually, when declaring a function and when using it, they don't mea=
n=20
> the same language construct, but still have a common meaning: they are ta=
gs.
> So only the translation would be different, not the meaning.
>
> Actually, with decltype(name:), whatever the translation of name: would=
=20
> be (type or object of that type), the result is still the same.
>
> =20
>
>>
>> In the end, I made it all as conservative as possible and as much based=
=20
>> on current practice as possible. The initial simplicity was deceiving,=
=20
>> because it was just a morning idea.
>>
>
> On the contrary, the initial simplicity was great. I think you shouldn't=
=20
> have tried to solve its issues by making more complex, but on the contrar=
y=20
> making it more simple (like I did).
>


It is more simple, in the sense, it maps 100% on to established practice=20
and 95+% on current types, declarations, scope, etc, rules=20

=20

> =20
>
>>
>> This is not to say we could not use some shortcut syntax.
>>
>> We could
>>
>> int foo(tag_name: float f);
>>
>> generate
>>
>> case struct tag_name; //< enclosing scope
>> int foo(case tag_name, float f);
>>
>> But I still question the pros/cons ratio.=20
>>
>>
>>
>>
>>> In your first proposal, you mentioned you wanted to be able to do=20
>>> something like that:
>>> any(in_place<string>: "");
>>> I don't think it is useful. you are not naming an argument here.
>>>
>>
>> In *most* cases tags are used it is not as if the argument is named.=20
>>
>
> =20

> True, tags are not names.
> Avoiding this use case makes the design very simple.
> Much simpler than all the alternatives you tried.
>

Why should I avoid this case, I don't understand? The colon is perfectly=20
deducible in different contexts to mean slightly different things, but it=
=20
*always *stands for a clarification.
=20

> =20
>
>>
>> Here it says "*string arguments here:*" and for that colon is=20
>> grammatically correct.
>>
>>
>> Also not naming an argument, but still grammatically correct:
>>
>> shared_lock( defer_lock: mtx);=20
>> shared_lock( try_to_lock: mtx);
>> shared_lock( adopt_lock: mtx);
>>
>> As in "...*the lock of: [the mutex]*"
>>
>>
>>> Now, to be fair, you could do something equivalent in C++20:
>>> int foo(std::tag<"tag_name">, float f);
>>>
>>> foo("tag_name"tag, 1.f);
>>>
>>> But the shorthand syntax would be very nice.
>>> Moreover, such a shorthand syntax would give people incentives to use i=
t=20
>>> (I consider it a good thing).
>>> Let's make a quick poll. Which one do you prefer? (try to see it as a=
=20
>>> newcomer to the language)
>>> std::find_if(v.begin(), v.end(), functor);
>>> std::find(v.begin(), v.end(), "if"tag, functor);
>>> std::find(v.begin(), v.end(), if: functor);
>>>
>>> I personally prefer the third one (I would like it even more with=20
>>> ranges).
>>> This is not really about the possibility to do it now, but how the=20
>>> syntax looks.
>>>
>>> Overall I want to clarify: that's my opinion, and I'm pretty sure some=
=20
>>> will disagree, but I really think it is worth pursuing.=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.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/3e91a810-20bc-4d91-b6ae-839b29f38a3b%40isocpp.or=
g.

------=_Part_332_1187150111.1533228603335
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Thursday, August 2, 2018 at 6:58:01 PM UTC+3, f=
loria...@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin:=
 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div =
dir=3D"ltr"><br><br>Le jeudi 2 ao=C3=BBt 2018 17:23:06 UTC+2, <a>mihailn...=
@gmail.com</a> a =C3=A9crit=C2=A0:<blockquote class=3D"gmail_quote" style=
=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"=
><div dir=3D"ltr"><div><b>Quote from=C2=A0<a onmousedown=3D"this.href=3D&#3=
9;https://groups.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/cz=
TCvTkSDQAJ&#39;;return true;" onclick=3D"this.href=3D&#39;https://groups.go=
ogle.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/czTCvTkSDQAJ&#39;;ret=
urn true;" href=3D"https://groups.google.com/a/isocpp.org/d/msg/std-proposa=
ls/wz0a7NrwnGQ/czTCvTkSDQAJ" target=3D"_blank" rel=3D"nofollow">https://gro=
ups.google.<wbr>com/a/isocpp.org/d/msg/std-<wbr>proposals/wz0a7NrwnGQ/<wbr>=
czTCvTkSDQAJ</a></b></div><div>=C2=A0</div><blockquote class=3D"gmail_quote=
" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(=
204,204,204);border-left-width:1px;border-left-style:solid"><div>I was thin=
king about this one: <a style=3D"border-bottom-color:rgb(17,85,204);border-=
bottom-style:none;border-bottom-width:0px;border-left-color:rgb(17,85,204);=
border-left-style:none;border-left-width:0px;border-right-color:rgb(17,85,2=
04);border-right-style:none;border-right-width:0px;border-top-color:rgb(17,=
85,204);border-top-style:none;border-top-width:0px;color:rgb(17,85,204);mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-decoration:n=
one" onmousedown=3D"this.href=3D&#39;https://groups.google.com/a/isocpp.org=
/forum/#!topic/std-proposals/O6rLutWGp4I&#39;;return true;" onclick=3D"this=
..href=3D&#39;https://groups.google.com/a/isocpp.org/forum/#!topic/std-propo=
sals/O6rLutWGp4I&#39;;return true;" href=3D"https://groups.google.com/a/iso=
cpp.org/forum/#!topic/std-proposals/O6rLutWGp4I" target=3D"_blank" rel=3D"n=
ofollow">https://groups.google.com/a/<wbr>isocpp.org/forum/#!topic/std-<wbr=
>proposals/O6rLutWGp4I</a> <br style=3D"border-bottom-color:rgb(34,34,34);b=
order-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34=
,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(34=
,34,34);border-right-style:none;border-right-width:0px;border-top-color:rgb=
(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34);l=
ine-height:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px"></div><div><br style=3D"border-bottom-color:rgb(34,34,34);border-botto=
m-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border=
-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bor=
der-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);=
border-top-style:none;border-top-width:0px;color:rgb(34,34,34);line-height:=
normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></div>=
<div>So let me tell you what I was thinking:</div><div><br style=3D"border-=
bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px=
;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0=
px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wi=
dth:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-wid=
th:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px"></div><div>There exist a common, yet unutt=
erable, where tag types live (lets call it tag_ns to simplify).</div><div><=
br style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;=
border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:n=
one;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:=
none;border-top-width:0px;color:rgb(34,34,34);line-height:normal;margin-bot=
tom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px"></div><div>When you dec=
lare a function with tags:</div><div><div style=3D"background-color:rgb(250=
,250,250);border-bottom-color:rgb(187,187,187);border-bottom-style:solid;bo=
rder-bottom-width:1px;border-left-color:rgb(187,187,187);border-left-style:=
solid;border-left-width:1px;border-right-color:rgb(187,187,187);border-righ=
t-style:solid;border-right-width:1px;border-top-color:rgb(187,187,187);bord=
er-top-style:solid;border-top-width:1px;margin-bottom:0px;margin-left:0px;m=
argin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-=
right:0px;padding-top:0px"><code style=3D"border-bottom-color:rgb(34,34,34)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,=
34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
34,34,34);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-l=
eft:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bottom-colo=
r:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;bor=
der-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px"><span style=3D"bo=
rder-bottom-color:rgb(0,0,136);border-bottom-style:none;border-bottom-width=
:0px;border-left-color:rgb(0,0,136);border-left-style:none;border-left-widt=
h:0px;border-right-color:rgb(0,0,136);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,136);border-top-style:none;border-top-wi=
dth:0px;color:rgb(0,0,136);margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px">int</span><span style=3D"border-bottom-color:rgb(0,0,0);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);bo=
rder-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);bo=
rder-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px=
;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding=
-left:0px;padding-right:0px;padding-top:0px"> foo</span><span style=3D"bord=
er-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-width=
:0px;border-left-color:rgb(102,102,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(102,102,0);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(102,102,0);border-top-style:none;border-=
top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px">(</span><span style=3D"border-bottom-color:rgb(0,0,0)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0=
,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(0,0=
,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(0,0=
,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px">tag_name</span><span sty=
le=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;bord=
er-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:none=
;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:no=
ne;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:=
0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pad=
ding-right:0px;padding-top:0px">:</span><span style=3D"border-bottom-color:=
rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-col=
or:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-col=
or:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px"> </span><span =
style=3D"border-bottom-color:rgb(0,0,136);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(0,0,136);border-left-style:none;borde=
r-left-width:0px;border-right-color:rgb(0,0,136);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(0,0,136);border-top-style:none;bo=
rder-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px">float</span><span style=3D"border-bottom-color:rgb=
(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:=
rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-color:=
rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px"> f</span><span st=
yle=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:n=
one;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px">);</span><span style=3D"border-bottom-colo=
r:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-c=
olor:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-c=
olor:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0)=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D=
"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width=
:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0=
px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span></d=
iv></code></div>The compiler creates a tag type in this namespace called ta=
g_name, and transform the declaration like that:</div><div><div style=3D"ba=
ckground-color:rgb(250,250,250);border-bottom-color:rgb(187,187,187);border=
-bottom-style:solid;border-bottom-width:1px;border-left-color:rgb(187,187,1=
87);border-left-style:solid;border-left-width:1px;border-right-color:rgb(18=
7,187,187);border-right-style:solid;border-right-width:1px;border-top-color=
:rgb(187,187,187);border-top-style:solid;border-top-width:1px;margin-bottom=
:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pad=
ding-left:0px;padding-right:0px;padding-top:0px"><code style=3D"border-bott=
om-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(34,34,34);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0=
px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px"><span style=3D"border-bottom-color:rgb(0,0,136);border-bottom-style:no=
ne;border-bottom-width:0px;border-left-color:rgb(0,0,136);border-left-style=
:none;border-left-width:0px;border-right-color:rgb(0,0,136);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(0,0,136);border-top-st=
yle:none;border-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;margin-l=
eft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px=
;padding-right:0px;padding-top:0px">int</span><span style=3D"border-bottom-=
color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-le=
ft-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-rig=
ht-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-t=
op-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,=
0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"> foo</sp=
an><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:no=
ne;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-righ=
t-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-=
top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;=
margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-=
left:0px;padding-right:0px;padding-top:0px">(</span><span style=3D"border-b=
ottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bord=
er-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bo=
rder-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:=
rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">ta=
g_ns</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-=
left-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);bor=
der-right-style:none;border-right-width:0px;border-top-color:rgb(102,102,0)=
;border-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bot=
tom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px">::</span><span style=3D=
"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width=
:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0=
px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">tag_name</span><span style=3D"border-bottom-color:rgb(102,102,0);bor=
der-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102=
,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(102=
,102,0);border-right-style:none;border-right-width:0px;border-top-color:rgb=
(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0)=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">,</span><spa=
n style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-=
left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border=
-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-t=
op-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px"> </span><span style=3D"border-bottom-color:rgb(0,0,136);bo=
rder-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,13=
6);border-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,=
136);border-right-style:none;border-right-width:0px;border-top-color:rgb(0,=
0,136);border-top-style:none;border-top-width:0px;color:rgb(0,0,136);margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:=
0px;padding-left:0px;padding-right:0px;padding-top:0px">float</span><span s=
tyle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-lef=
t-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-=
width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px"> f</span><span style=3D"border-bottom-color:rgb(102,102,0);bo=
rder-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,10=
2,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(10=
2,102,0);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0=
);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">);</span><s=
pan style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;borde=
r-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border=
-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-botto=
m-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-le=
ft-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-ri=
ght-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-to=
p-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-=
right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:=
0px;padding-top:0px"></span></div></code></div></div><div><br style=3D"bord=
er-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:=
0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-widt=
h:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-right=
-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-=
width:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;margin-l=
eft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px=
;padding-right:0px;padding-top:0px"></div><div>When you call a function wit=
h a tag:</div><div><div style=3D"background-color:rgb(250,250,250);border-b=
ottom-color:rgb(187,187,187);border-bottom-style:solid;border-bottom-width:=
1px;border-left-color:rgb(187,187,187);border-left-style:solid;border-left-=
width:1px;border-right-color:rgb(187,187,187);border-right-style:solid;bord=
er-right-width:1px;border-top-color:rgb(187,187,187);border-top-style:solid=
;border-top-width:1px;margin-bottom:0px;margin-left:0px;margin-right:0px;ma=
rgin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-=
top:0px"><code style=3D"border-bottom-color:rgb(34,34,34);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);borde=
r-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34);bo=
rder-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,=
34);border-left-style:none;border-left-width:0px;border-right-color:rgb(34,=
34,34);border-right-style:none;border-right-width:0px;border-top-color:rgb(=
34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;marg=
in-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left=
:0px;padding-right:0px;padding-top:0px"><span style=3D"border-bottom-color:=
rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-col=
or:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-col=
or:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px">foo</span><spa=
n style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none=
;border-left-width:0px;border-right-color:rgb(102,102,0);border-right-style=
:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-sty=
le:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px">(</span><span style=3D"border-bottom-c=
olor:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-to=
p-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0=
,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">tag_name<=
/span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-=
style:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);bord=
er-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px">:</span><span style=3D"borde=
r-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px=
;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;col=
or:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top=
:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"=
> </span><span style=3D"border-bottom-color:rgb(0,102,102);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(0,102,102);border-le=
ft-style:none;border-left-width:0px;border-right-color:rgb(0,102,102);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(0,102,102);b=
order-top-style:none;border-top-width:0px;color:rgb(0,102,102);margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px">1.f</span><span style=3D"=
border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(102,102,0);border-left-style:none;border-lef=
t-width:0px;border-right-color:rgb(102,102,0);border-right-style:none;borde=
r-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:none;bor=
der-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px">);</span><span style=3D"border-bottom-color:rgb(0=
,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rg=
b(0,0,0);border-left-style:none;border-left-width:0px;border-right-color:rg=
b(0,0,0);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:=
0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border=
-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bo=
rder-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span></div></co=
de></div></div><div>The
 compiler creates a tag type in this namespace called tag_name, replaces
 the expression with a call like that (without even needing to know the=20
declaration of the function):</div><div><div style=3D"background-color:rgb(=
250,250,250);border-bottom-color:rgb(187,187,187);border-bottom-style:solid=
;border-bottom-width:1px;border-left-color:rgb(187,187,187);border-left-sty=
le:solid;border-left-width:1px;border-right-color:rgb(187,187,187);border-r=
ight-style:solid;border-right-width:1px;border-top-color:rgb(187,187,187);b=
order-top-style:solid;border-top-width:1px;margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px"><code style=3D"border-bottom-color:rgb(34,34,=
34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(=
34,34,34);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(34,34,34);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0p=
x;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddin=
g-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bottom-c=
olor:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><span style=3D=
"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width=
:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0=
px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">foo</span><span style=3D"border-bottom-color:rgb(102,102,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,=
0);border-right-style:none;border-right-width:0px;border-top-color:rgb(102,=
102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px">(</span><span sty=
le=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom=
-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-=
width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-righ=
t-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-wi=
dth:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px">tag_ns</span><span style=3D"border-bottom-color:rgb(102,102,0);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,=
102,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
102,102,0);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102=
,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">::</span>=
<span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bord=
er-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-=
right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:=
0px;padding-top:0px">tag_name</span><span style=3D"border-bottom-color:rgb(=
102,102,0);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-right=
-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:=
rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
">{},</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-st=
yle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-s=
tyle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-sty=
le:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px"> </span><span style=3D"border-bottom-color=
:rgb(0,102,102);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(0,102,102);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(0,102,102);border-right-style:none;border-right-width:0px;b=
order-top-color:rgb(0,102,102);border-top-style:none;border-top-width:0px;c=
olor:rgb(0,102,102);margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">1.f</span><span style=3D"border-bottom-color:rgb(102,102,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,=
0);border-right-style:none;border-right-width:0px;border-top-color:rgb(102,=
102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px">);</span><span st=
yle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left=
-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-rig=
ht-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-w=
idth:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-styl=
e:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px"></span></div></code></div><br style=3D"border-bottom-color:r=
gb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:r=
gb(34,34,34);line-height:normal;margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px">If two functions (even in different namespaces) use the =
same tag name, they will have the same tag type, which is fine.</div></bloc=
kquote><div><br></div><div>Yes, initially I was thinking names are names no=
 matter the namespace, but I <span style=3D"display:inline!important;float:=
none;background-color:transparent;color:rgb(34,34,34);font-family:&quot;Ari=
al&quot;,&quot;Helvetica&quot;,sans-serif;font-size:13px;font-style:normal;=
font-variant:normal;font-weight:400;letter-spacing:normal;text-align:left;t=
ext-decoration:none;text-indent:0px;text-transform:none;white-space:normal;=
word-spacing:0px">abandoned </span>this.</div><div><br></div><div>I abandon=
ed it because tags are types, and are used for overload resolution. If the =
std has a tag named &#39;par&#39; and I want to use this name but with diff=
erent implementation, I must be able to do that, much like today</div><div>=
We need namespaces for tags, and,=C2=A0 to the very least labels should be =
defined in the namespace of the functions.</div></div></blockquote><div><br=
></div></div></blockquote><div>=C2=A0</div><blockquote class=3D"gmail_quote=
" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding=
-left: 1ex;"><div dir=3D"ltr"><div></div><div>The tag has no implementation=
, only the overload using the tag has an implementation. So there is absolu=
tely no problem here.</div><div><div style=3D"background-color:rgb(250,250,=
250);border-color:rgb(187,187,187);border-style:solid;border-width:1px"><co=
de><div><span style=3D"color:#008">void</span><span style=3D"color:#000"> f=
oo</span><span style=3D"color:#660">(</span><span style=3D"color:#000">tag<=
/span><span style=3D"color:#660">:);</span><span style=3D"color:#000"><br><=
/span><span style=3D"color:#008">void</span><span style=3D"color:#000"> bar=
</span><span style=3D"color:#660">(</span><span style=3D"color:#000">tag</s=
pan><span style=3D"color:#660">:);</span><span style=3D"color:#000"><br></s=
pan></div></code></div></div><div><br></div><div>Why tag in both cases coul=
dn&#39;t be the same? We use nothing from those tag objects.</div></div></b=
lockquote><div><br></div><div>Tags are used for specialization of functions=
 (parallel library is an example). I must be able to declare tags that are =
named the same as the std ones, yet are different type and will pick my ove=
rload, not the std one.=C2=A0</div><div><br></div><div>If we completely rem=
ove namespaces for tags people will be forced to go the C-way of naming to =
be able to create new type under the &quot;same name&quot; - cuda_parallel =
- to force new overload.</div><div>=C2=A0</div><blockquote class=3D"gmail_q=
uote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;pad=
ding-left: 1ex;"><div dir=3D"ltr"><div><br></div><div>How many real world c=
ode use non-empty classes as tags?=C2=A0</div></div></blockquote><blockquot=
e class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: =
1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div></div><div>=C2=A0<=
/div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;=
border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></di=
v><div>But then I also abended automatic introduction...<br></div></div></b=
lockquote><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0=
..8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></d=
iv><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0=
px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-lef=
t-width:1px;border-left-style:solid"><div>...</div><div><div style=3D"borde=
r-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width=
:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-w=
idth:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;=
padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br =
style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-=
bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none=
;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:non=
e;border-top-width:0px;color:rgb(34,34,34);line-height:normal;margin-bottom=
:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pad=
ding-left:0px;padding-right:0px;padding-top:0px"></div><div style=3D"border=
-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0p=
x;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:=
0px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-w=
idth:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-wi=
dth:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;p=
adding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">The m=
ain feature here would be the automatic introduction of types. A bit like a=
 template instantiation. It is implicit.<br style=3D"border-bottom-color:rg=
b(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-co=
lor:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right=
-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-=
top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rg=
b(34,34,34);line-height:normal;margin-bottom:0px;margin-left:0px;margin-rig=
ht:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px=
;padding-top:0px"></div></div></blockquote><div><br></div><div>Automatic in=
troduction is not that good of a barging - we invent new rules to save some=
 typing, but new problems arise.=C2=A0</div></div></blockquote><div><br></d=
iv><div>What are those problems ?</div><div>If tag: refers to a single type=
 wherever you are (even across TUs), then what is the problem?<br></div><di=
v>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-le=
ft:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div=
><br></div><div>Where are tags created? How can we make them template? How =
can we add attributes to them? Is this really new signature?</div></div></b=
lockquote><div><br></div><div>First, I was thinking in an unutterable names=
pace, yet common to all TUs.</div><div>But then, making them an instantiati=
on of std::tag&lt;&quot;tag_name&quot;&gt; might be better.<br></div><div><=
br></div><div>You don&#39;t add attributes to them because you don&#39;t ne=
ed to. Do you add attributes to the definition of std::string?<br></div><di=
v>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-le=
ft:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div=
><br></div><div><b>Sidenote</b>, how do you name the type to create a funct=
ion signature?<font face=3D"courier new,monospace"> decltype(name:)</font>?=
 <font face=3D"courier new,monospace">name:</font> to mean different things=
 in different contexts? Things escalate quickly.=C2=A0</div></div></blockqu=
ote><div><br></div></div></blockquote><div>=C2=A0</div><blockquote class=3D=
"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc s=
olid;padding-left: 1ex;"><div dir=3D"ltr"><div></div><div>When you declare =
a function, you would do:</div><div><div style=3D"background-color:rgb(250,=
250,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px"=
><code><div><span style=3D"color:#008">void</span><span style=3D"color:#000=
"> foo</span><span style=3D"color:#660">(</span><span style=3D"color:#000">=
tag_name</span><span style=3D"color:#660">:);</span><span style=3D"color:#0=
00"><br></span><span style=3D"color:#800">// or</span><span style=3D"color:=
#000"><br></span><span style=3D"color:#800">// void foo(std::tag&lt;&quot;t=
ag_name&quot;&gt;);</span><span style=3D"color:#000"><br></span></div></cod=
e></div><br></div><div>That&#39;s true <span style=3D"font-family:courier n=
ew,monospace">name:</span> would have different meaning depending on the co=
ntext, but that&#39;s would be the case anyway because of labels.</div></di=
v></blockquote><div><br></div><div>And what about std::function and pointer=
s to functions? We will need to touch a lot of places to enable this syntax=
.. =C2=A0</div><div><br></div><div>Also note that we will need extra rules w=
hat introduces and what just names a label. And these are not trivial, we c=
an&#39;t always blindly introduce.=C2=A0</div><div>Makes no sense to introd=
uce a type by declaring a function pointer, even if we agree to not have na=
mespaces for them.</div><div><br></div><div>=C2=A0</div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #cc=
c solid;padding-left: 1ex;"><div dir=3D"ltr"><div>And actually, when declar=
ing a function and when using it, they don&#39;t mean the same language con=
struct, but still have a common meaning: they are tags.</div><div>So only t=
he translation would be different, not the meaning.</div><div><br></div><di=
v>Actually, with <span style=3D"font-family:courier new,monospace">decltype=
(name:)</span>, whatever the translation of <span style=3D"font-family:cour=
ier new,monospace">name:</span> would be (type or object of that type), the=
 result is still the same.<br></div><div><br></div><div>=C2=A0</div><blockq=
uote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:=
1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>In th=
e end, I made it all as conservative as possible and as much based on curre=
nt practice as possible. The initial simplicity was deceiving, because it w=
as just a morning idea.</div></div></blockquote><div><br></div><div>On the =
contrary, the initial simplicity was great. I think you shouldn&#39;t have =
tried to solve its issues by making more complex, but on the contrary makin=
g it more simple (like I did).<br></div></div></blockquote><div><br></div><=
div><br></div><div>It is more simple, in the sense, it maps 100% on to esta=
blished practice and 95+% on current types, declarations, scope, etc, rules=
=C2=A0<br></div><div><br></div><div>=C2=A0</div><blockquote class=3D"gmail_=
quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;pa=
dding-left: 1ex;"><div dir=3D"ltr"><div></div><div>=C2=A0</div><blockquote =
class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #=
ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>This is no=
t to say we could not use some shortcut syntax.</div><div><br></div><div>We=
 could</div><div><br></div><font face=3D"courier new,monospace">int foo(tag=
_name: float f);</font><div><br></div><div>generate</div><div><br></div><di=
v><span style=3D"text-align:left;color:rgb(34,34,34);text-transform:none;te=
xt-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal;font-v=
ariant:normal;font-weight:400;text-decoration:none;word-spacing:0px;display=
:inline!important;white-space:normal;float:none;background-color:transparen=
t"><font face=3D"courier new,monospace">case struct tag_name; //&lt; enclos=
ing scope</font></span><b></b><i></i><u></u><sub></sub><sup></sup><strike><=
/strike><br></div><div><font face=3D"courier new,monospace">i<span style=3D=
"text-align:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;le=
tter-spacing:normal;font-size:13px;font-style:normal;font-variant:normal;fo=
nt-weight:400;text-decoration:none;word-spacing:0px;display:inline!importan=
t;white-space:normal;float:none;background-color:transparent">nt foo(case t=
ag_name, float f);</span></font></div><div><font face=3D"courier new,monosp=
ace"><span style=3D"text-align:left;color:rgb(34,34,34);text-transform:none=
;text-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal;fon=
t-variant:normal;font-weight:400;text-decoration:none;word-spacing:0px;disp=
lay:inline!important;white-space:normal;float:none;background-color:transpa=
rent"><br></span></font></div><div><span style=3D"text-align:left;color:rgb=
(34,34,34);text-transform:none;text-indent:0px;letter-spacing:normal;font-s=
ize:13px;font-style:normal;font-variant:normal;font-weight:400;text-decorat=
ion:none;word-spacing:0px;display:inline!important;white-space:normal;float=
:none;background-color:transparent"><font face=3D"arial,sans-serif">But I s=
till question the pros/cons ratio.=C2=A0</font></span></div><div><font face=
=3D"courier new,monospace"></font><br></div><div><b></b><i></i><u></u><sub>=
</sub><sup></sup><strike></strike><font face=3D"courier new,monospace"></fo=
nt><br></div><div><br></div><blockquote class=3D"gmail_quote" style=3D"marg=
in:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);bo=
rder-left-width:1px;border-left-style:solid"><div><div style=3D"border-bott=
om-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(34,34,34);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0=
px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></div><div=
 style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:no=
ne;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px"><br style=3D"border-bottom-color:rgb(34,34,34);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);borde=
r-top-style:none;border-top-width:0px;color:rgb(34,34,34);line-height:norma=
l;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></div><div =
style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-=
bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none=
;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:non=
e;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;m=
argin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding=
-top:0px">In your first proposal, you mentioned you wanted to be able to do=
 something like that:</div><div style=3D"border-bottom-color:rgb(34,34,34);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,3=
4,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(3=
4,34,34);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px"><div style=3D"background-color:rg=
b(250,250,250);border-bottom-color:rgb(187,187,187);border-bottom-style:sol=
id;border-bottom-width:1px;border-left-color:rgb(187,187,187);border-left-s=
tyle:solid;border-left-width:1px;border-right-color:rgb(187,187,187);border=
-right-style:solid;border-right-width:1px;border-top-color:rgb(187,187,187)=
;border-top-style:solid;border-top-width:1px;margin-bottom:0px;margin-left:=
0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pad=
ding-right:0px;padding-top:0px"><code style=3D"border-bottom-color:rgb(34,3=
4,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rg=
b(34,34,34);border-left-style:none;border-left-width:0px;border-right-color=
:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-co=
lor:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bottom=
-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;bor=
der-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0p=
x;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><span style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;m=
argin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding=
-top:0px">any</span><span style=3D"border-bottom-color:rgb(102,102,0);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0=
);border-left-style:none;border-left-width:0px;border-right-color:rgb(102,1=
02,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(1=
02,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px">(</span><span =
style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bot=
tom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-le=
ft-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top=
-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px">in_place</span><span style=3D"border-bottom-color:rgb(0,136,=
0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0=
,136,0);border-left-style:none;border-left-width:0px;border-right-color:rgb=
(0,136,0);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(0,136,0);border-top-style:none;border-top-width:0px;color:rgb(0,136,0);m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px">&lt;string&gt;=
</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);bor=
der-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px">:</span><span style=3D"bord=
er-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px=
;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;=
border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0p=
x;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;co=
lor:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
"> </span><span style=3D"border-bottom-color:rgb(0,136,0);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(0,136,0);border-left-=
style:none;border-left-width:0px;border-right-color:rgb(0,136,0);border-rig=
ht-style:none;border-right-width:0px;border-top-color:rgb(0,136,0);border-t=
op-style:none;border-top-width:0px;color:rgb(0,136,0);margin-bottom:0px;mar=
gin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-lef=
t:0px;padding-right:0px;padding-top:0px">&quot;&quot;</span><span style=3D"=
border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(102,102,0);border-left-style:none;border-lef=
t-width:0px;border-right-color:rgb(102,102,0);border-right-style:none;borde=
r-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:none;bor=
der-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px">);</span><span style=3D"border-bottom-color:rgb(0=
,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rg=
b(0,0,0);border-left-style:none;border-left-width:0px;border-right-color:rg=
b(0,0,0);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:=
0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border=
-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bo=
rder-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span></div></co=
de></div>I don&#39;t think it is useful. you are not naming an argument her=
e.</div></div></blockquote><div><br></div><div>In <i>most</i> cases tags ar=
e used it is not as if the argument is named.=C2=A0</div></div></blockquote=
><div><br></div></div></blockquote><div>=C2=A0</div><blockquote class=3D"gm=
ail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc soli=
d;padding-left: 1ex;"><div dir=3D"ltr"><div></div><div>True, tags are not n=
ames.</div><div>Avoiding this use case makes the design very simple.</div><=
div>Much simpler than all the alternatives you tried.</div></div></blockquo=
te><div><br></div><div>Why should I avoid this case, I don&#39;t understand=
? The colon is perfectly deducible in different contexts to mean slightly d=
ifferent things, but it <i>always=C2=A0</i>stands for a clarification.</div=
><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;marg=
in-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"=
ltr"><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0;m=
argin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"l=
tr"><div><br></div><div>Here it says &quot;<i>string arguments here<b>:</b>=
</i>&quot; and for that colon is grammatically correct.<br></div><div><span=
><br></span></div><div><span><br></span></div><div>Also not naming an argum=
ent, but still grammatically correct:</div><div><br><font face=3D"courier n=
ew,monospace">shared_lock( defer_lock: mtx);=C2=A0<br>shared_lock( try_to_l=
ock: mtx);<br></font></div><div><font face=3D"courier new,monospace">shared=
_lock( adopt_lock: mtx);</font></div><div><br></div><div>As in &quot;...<i>=
the lock of<b>:</b> [the mutex]</i>&quot;</div><div><span><b></b><i></i><u>=
</u><sub></sub><sup></sup><strike></strike><br></span><span></span></div><b=
lockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-l=
eft:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-lef=
t-style:solid"><div><div style=3D"border-bottom-color:rgb(34,34,34);border-=
bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34=
);border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34=
,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px"><b></b><i></i><u></u><sub></sub><sup></s=
up><strike></strike><br style=3D"border-bottom-color:rgb(34,34,34);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);bo=
rder-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34)=
;border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,=
34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34);line-hei=
ght:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></=
div><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:non=
e;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style=
:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-s=
tyle:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-=
style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px">Now, to be fair, you could do something equivalent in C+=
+20:</div><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);borde=
r-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px"><div style=3D"background-color:rgb(250,250,250);bo=
rder-bottom-color:rgb(187,187,187);border-bottom-style:solid;border-bottom-=
width:1px;border-left-color:rgb(187,187,187);border-left-style:solid;border=
-left-width:1px;border-right-color:rgb(187,187,187);border-right-style:soli=
d;border-right-width:1px;border-top-color:rgb(187,187,187);border-top-style=
:solid;border-top-width:1px;margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px"><code style=3D"border-bottom-color:rgb(34,34,34);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);borde=
r-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34)=
;border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0=
px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padd=
ing-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,=
34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(=
34,34,34);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(34,34,34);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0p=
x;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddin=
g-left:0px;padding-right:0px;padding-top:0px"><span style=3D"border-bottom-=
color:rgb(0,0,136);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(0,0,136);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(0,0,136);border-right-style:none;border-right-width:0px;bo=
rder-top-color:rgb(0,0,136);border-top-style:none;border-top-width:0px;colo=
r:rgb(0,0,136);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
">int</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-st=
yle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-s=
tyle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-sty=
le:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px"> foo</span><span style=3D"border-bottom-co=
lor:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(102,102,0);border-left-style:none;border-left-width:0px;bord=
er-right-color:rgb(102,102,0);border-right-style:none;border-right-width:0p=
x;border-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0p=
x;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;m=
argin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding=
-top:0px">(</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-l=
eft-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-t=
op-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margi=
n-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:=
0px;padding-right:0px;padding-top:0px">std</span><span style=3D"border-bott=
om-color:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px;bo=
rder-left-color:rgb(102,102,0);border-left-style:none;border-left-width:0px=
;border-right-color:rgb(102,102,0);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(102,102,0);border-top-style:none;border-top-wid=
th:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px">::</span><span style=3D"border-bottom-color:rgb(0,0,0);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);bo=
rder-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);bo=
rder-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px=
;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding=
-left:0px;padding-right:0px;padding-top:0px">tag</span><span style=3D"borde=
r-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-width:=
0px;border-left-color:rgb(102,102,0);border-left-style:none;border-left-wid=
th:0px;border-right-color:rgb(102,102,0);border-right-style:none;border-rig=
ht-width:0px;border-top-color:rgb(102,102,0);border-top-style:none;border-t=
op-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-=
right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:=
0px;padding-top:0px">&lt;</span><span style=3D"border-bottom-color:rgb(0,13=
6,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb=
(0,136,0);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(0,136,0);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(0,136,0);border-top-style:none;border-top-width:0px;color:rgb(0,136,0)=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">&quot;tag_na=
me&quot;</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bot=
tom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);bor=
der-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,0)=
;border-right-style:none;border-right-width:0px;border-top-color:rgb(102,10=
2,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:=
0px;padding-left:0px;padding-right:0px;padding-top:0px">&gt;,</span><span s=
tyle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-lef=
t-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-=
width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px"> </span><span style=3D"border-bottom-color:rgb(0,0,136);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,136);=
border-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,136=
);border-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,1=
36);border-top-style:none;border-top-width:0px;color:rgb(0,0,136);margin-bo=
ttom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px=
;padding-left:0px;padding-right:0px;padding-top:0px">float</span><span styl=
e=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-=
width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-w=
idth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right=
-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-wid=
th:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px"> f</span><span style=3D"border-bottom-color:rgb(102,102,0);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0=
);border-left-style:none;border-left-width:0px;border-right-color:rgb(102,1=
02,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(1=
02,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px">);</span><span=
 style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-=
right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-to=
p-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right=
:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;p=
adding-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom-s=
tyle:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-=
style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right=
-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-s=
tyle:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-rig=
ht:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px=
;padding-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-rig=
ht-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top=
-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px">foo</span><span style=3D"border-bottom-color:rgb(102,10=
2,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb=
(102,102,0);border-left-style:none;border-left-width:0px;border-right-color=
:rgb(102,102,0);border-right-style:none;border-right-width:0px;border-top-c=
olor:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(10=
2,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;=
padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">(</s=
pan><span style=3D"border-bottom-color:rgb(0,136,0);border-bottom-style:non=
e;border-bottom-width:0px;border-left-color:rgb(0,136,0);border-left-style:=
none;border-left-width:0px;border-right-color:rgb(0,136,0);border-right-sty=
le:none;border-right-width:0px;border-top-color:rgb(0,136,0);border-top-sty=
le:none;border-top-width:0px;color:rgb(0,136,0);margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px">&quot;tag_name&quot;</span><span style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;m=
argin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding=
-top:0px">tag</span><span style=3D"border-bottom-color:rgb(102,102,0);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0=
);border-left-style:none;border-left-width:0px;border-right-color:rgb(102,1=
02,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(1=
02,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px">,</span><span =
style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bot=
tom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-le=
ft-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top=
-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px"> </span><span style=3D"border-bottom-color:rgb(0,102,102);bo=
rder-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,102,=
102);border-left-style:none;border-left-width:0px;border-right-color:rgb(0,=
102,102);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(0,102,102);border-top-style:none;border-top-width:0px;color:rgb(0,102,102=
);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">1.f</span><=
span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;b=
order-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(102,102,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-=
style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;marg=
in-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left=
:0px;padding-right:0px;padding-top:0px">);</span><span style=3D"border-bott=
om-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border=
-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;borde=
r-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb=
(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;p=
adding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br s=
tyle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-lef=
t-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-=
width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></s=
pan></div></code></div></div><div style=3D"border-bottom-color:rgb(34,34,34=
);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34=
,34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb=
(34,34,34);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;=
margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-=
left:0px;padding-right:0px;padding-top:0px"><br style=3D"border-bottom-colo=
r:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;bor=
der-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;colo=
r:rgb(34,34,34);line-height:normal;margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px"></div><div style=3D"border-bottom-color:rgb(34,34,34)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,=
34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
34,34,34);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-l=
eft:0px;padding-right:0px;padding-top:0px">But the shorthand syntax would b=
e very nice.</div><div style=3D"border-bottom-color:rgb(34,34,34);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);bor=
der-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,3=
4);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px">Moreover, such a shorthand syntax would gi=
ve people incentives to use it (I consider it a good thing).</div><div styl=
e=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-=
left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bor=
der-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bo=
rder-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margi=
n-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top=
:0px">Let&#39;s make a quick poll. Which one do you prefer? (try to see it =
as a newcomer to the language)<br style=3D"border-bottom-color:rgb(34,34,34=
);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34=
,34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb=
(34,34,34);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34=
);line-height:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px"></div><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-=
left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bord=
er-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);b=
order-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px"><div style=3D"background-color:rgb(250,250,250=
);border-bottom-color:rgb(187,187,187);border-bottom-style:solid;border-bot=
tom-width:1px;border-left-color:rgb(187,187,187);border-left-style:solid;bo=
rder-left-width:1px;border-right-color:rgb(187,187,187);border-right-style:=
solid;border-right-width:1px;border-top-color:rgb(187,187,187);border-top-s=
tyle:solid;border-top-width:1px;margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px"><code style=3D"border-bottom-color:rgb(34,34,34);border-=
bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34=
);border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34=
,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34=
,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:=
rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-col=
or:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-=
color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px"><span style=3D"border-bot=
tom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rg=
b(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;=
padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">std<=
/span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-=
style:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);bord=
er-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px">::</span><span style=3D"bord=
er-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px=
;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;=
border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0p=
x;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;co=
lor:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
">find_if</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);bo=
rder-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,0=
);border-right-style:none;border-right-width:0px;border-top-color:rgb(102,1=
02,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);margi=
n-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom=
:0px;padding-left:0px;padding-right:0px;padding-top:0px">(</span><span styl=
e=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-=
width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-w=
idth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right=
-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-wid=
th:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px">v</span><span style=3D"border-bottom-color:rgb(102,102,0);border=
-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0)=
;border-left-style:none;border-left-width:0px;border-right-color:rgb(102,10=
2,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(10=
2,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bot=
tom:0px;padding-left:0px;padding-right:0px;padding-top:0px">.</span><span s=
tyle=3D"border-bottom-color:rgb(0,0,136);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(0,0,136);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(0,0,136);border-right-style:none;bor=
der-right-width:0px;border-top-color:rgb(0,0,136);border-top-style:none;bor=
der-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;margin-left:0px;marg=
in-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-rig=
ht:0px;padding-top:0px">begin</span><span style=3D"border-bottom-color:rgb(=
102,102,0);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-right=
-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:=
rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
">(),</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-st=
yle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-s=
tyle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-sty=
le:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px"> v</span><span style=3D"border-bottom-colo=
r:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px;border-le=
ft-color:rgb(102,102,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;=
color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px">.</span><span style=3D"border-bottom-color:rgb(0,0,136);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,136);border=
-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,136);bord=
er-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,136);bo=
rder-top-style:none;border-top-width:0px;color:rgb(0,0,136);margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px">end</span><span style=3D"bor=
der-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(102,102,0);border-left-style:none;border-left-w=
idth:0px;border-right-color:rgb(102,102,0);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(102,102,0);border-top-style:none;border=
-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margi=
n-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-righ=
t:0px;padding-top:0px">(),</span><span style=3D"border-bottom-color:rgb(0,0=
,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(=
0,0,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
0,0,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(=
0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-b=
ottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0p=
x;padding-left:0px;padding-right:0px;padding-top:0px"> functor</span><span =
style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;b=
order-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:n=
one;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-style=
:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px">);</span><span style=3D"border-bottom-co=
lor:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left=
-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right=
-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,=
0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">std</sp=
an><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:no=
ne;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-righ=
t-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-=
top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;=
margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-=
left:0px;padding-right:0px;padding-top:0px">::</span><span style=3D"border-=
bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bo=
rder-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bor=
der-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;b=
order-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color=
:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0=
px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">f=
ind</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-s=
tyle:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-l=
eft-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);bord=
er-right-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);=
border-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px">(</span><span style=3D"b=
order-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:=
0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0=
px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width=
:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px=
;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px">v</span><span style=3D"border-bottom-color:rgb(102,102,0);border-botto=
m-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);borde=
r-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);b=
order-right-style:none;border-right-width:0px;border-top-color:rgb(102,102,=
0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-b=
ottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0p=
x;padding-left:0px;padding-right:0px;padding-top:0px">.</span><span style=
=3D"border-bottom-color:rgb(0,0,136);border-bottom-style:none;border-bottom=
-width:0px;border-left-color:rgb(0,0,136);border-left-style:none;border-lef=
t-width:0px;border-right-color:rgb(0,0,136);border-right-style:none;border-=
right-width:0px;border-top-color:rgb(0,0,136);border-top-style:none;border-=
top-width:0px;color:rgb(0,0,136);margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px">begin</span><span style=3D"border-bottom-color:rgb(102,=
102,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:r=
gb(102,102,0);border-left-style:none;border-left-width:0px;border-right-col=
or:rgb(102,102,0);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(=
102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">()=
,</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:n=
one;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:=
none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style=
:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:n=
one;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px"> v</span><span style=3D"border-bottom-color:rg=
b(102,102,0);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-rig=
ht-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;colo=
r:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px">.</span><span style=3D"border-bottom-color:rgb(0,0,136);border-bottom-s=
tyle:none;border-bottom-width:0px;border-left-color:rgb(0,0,136);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(0,0,136);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(0,0,136);border=
-top-style:none;border-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-l=
eft:0px;padding-right:0px;padding-top:0px">end</span><span style=3D"border-=
bottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0p=
x;border-left-color:rgb(102,102,0);border-left-style:none;border-left-width=
:0px;border-right-color:rgb(102,102,0);border-right-style:none;border-right=
-width:0px;border-top-color:rgb(102,102,0);border-top-style:none;border-top=
-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px">(),</span><span style=3D"border-bottom-color:rgb(0,0,0);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,=
0);border-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,=
0);border-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,=
0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px"> </span><span style=3D"bo=
rder-bottom-color:rgb(0,136,0);border-bottom-style:none;border-bottom-width=
:0px;border-left-color:rgb(0,136,0);border-left-style:none;border-left-widt=
h:0px;border-right-color:rgb(0,136,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,136,0);border-top-style:none;border-top-wi=
dth:0px;color:rgb(0,136,0);margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px">&quot;if&quot;</span><span style=3D"border-bottom-color:rgb(0=
,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rg=
b(0,0,0);border-left-style:none;border-left-width:0px;border-right-color:rg=
b(0,0,0);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:=
0px;padding-left:0px;padding-right:0px;padding-top:0px">tag</span><span sty=
le=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;bord=
er-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:none=
;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:no=
ne;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:=
0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pad=
ding-right:0px;padding-top:0px">,</span><span style=3D"border-bottom-color:=
rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-col=
or:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-col=
or:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px"> functor</span=
><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none=
;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style=
:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-to=
p-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px">);</span><span style=3D"border-bo=
ttom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bord=
er-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bor=
der-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:r=
gb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><co=
de style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-=
bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;borde=
r-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-=
top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top=
:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"=
><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bor=
der-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border=
-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border=
-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border=
-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;marg=
in-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-rig=
ht:0px;padding-top:0px">std</span><span style=3D"border-bottom-color:rgb(10=
2,102,0);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-right-c=
olor:rgb(102,102,0);border-right-style:none;border-right-width:0px;border-t=
op-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rg=
b(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:=
0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">=
::</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:=
none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style=
:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-styl=
e:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:=
none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px">find</span><span style=3D"border-bottom-color=
:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;b=
order-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;c=
olor:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">(</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-righ=
t-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-=
style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-l=
eft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px=
;padding-right:0px;padding-top:0px">v</span><span style=3D"border-bottom-co=
lor:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(102,102,0);border-left-style:none;border-left-width:0px;bord=
er-right-color:rgb(102,102,0);border-right-style:none;border-right-width:0p=
x;border-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0p=
x;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;m=
argin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding=
-top:0px">.</span><span style=3D"border-bottom-color:rgb(0,0,136);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,136);bord=
er-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,136);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,136);=
border-top-style:none;border-top-width:0px;color:rgb(0,0,136);margin-bottom=
:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pad=
ding-left:0px;padding-right:0px;padding-top:0px">begin</span><span style=3D=
"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-=
width:0px;border-left-color:rgb(102,102,0);border-left-style:none;border-le=
ft-width:0px;border-right-color:rgb(102,102,0);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:none;bo=
rder-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;m=
argin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-=
right:0px;padding-top:0px">(),</span><span style=3D"border-bottom-color:rgb=
(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:=
rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-color:=
rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px"> v</span><span st=
yle=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:n=
one;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px">.</span><span style=3D"border-bottom-color=
:rgb(0,0,136);border-bottom-style:none;border-bottom-width:0px;border-left-=
color:rgb(0,0,136);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(0,0,136);border-right-style:none;border-right-width:0px;border-=
top-color:rgb(0,0,136);border-top-style:none;border-top-width:0px;color:rgb=
(0,0,136);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">end=
</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);bor=
der-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px">(),</span><span style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px"> </span><span style=3D"border-bottom-color:rgb(0,0,136);border-bottom-s=
tyle:none;border-bottom-width:0px;border-left-color:rgb(0,0,136);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(0,0,136);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(0,0,136);border=
-top-style:none;border-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-l=
eft:0px;padding-right:0px;padding-top:0px">if</span><span style=3D"border-b=
ottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px=
;border-left-color:rgb(102,102,0);border-left-style:none;border-left-width:=
0px;border-right-color:rgb(102,102,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(102,102,0);border-top-style:none;border-top-=
width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-rig=
ht:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px=
;padding-top:0px">:</span><span style=3D"border-bottom-color:rgb(0,0,0);bor=
der-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);=
border-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);=
border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px"> functor</span><span style=
=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:none=
;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px">);</span><span style=3D"border-bottom-color:r=
gb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-colo=
r:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-colo=
r:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bot=
tom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span></code=
></span></div></code></div><br style=3D"border-bottom-color:rgb(34,34,34);b=
order-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34=
,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(34=
,34,34);border-right-style:none;border-right-width:0px;border-top-color:rgb=
(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34);l=
ine-height:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px">I personally prefer the third one (I would like it even more with rang=
es).</div><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);borde=
r-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px">This is not really about the possibility to do it =
now, but how the syntax looks.<br style=3D"border-bottom-color:rgb(34,34,34=
);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34=
,34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb=
(34,34,34);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34=
);line-height:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px"></div><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-=
left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bord=
er-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);b=
order-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(34,34,34)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,=
34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
34,34,34);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34)=
;line-height:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px"></div><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-l=
eft-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bo=
rder-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;=
margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding=
-right:0px;padding-top:0px">Overall I want to clarify: that&#39;s my opinio=
n, and I&#39;m pretty sure some will disagree, but I really think it is wor=
th pursuing.=C2=A0</div></div></blockquote></div></blockquote></div></block=
quote></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/3e91a810-20bc-4d91-b6ae-839b29f38a3b%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/3e91a810-20bc-4d91-b6ae-839b29f38a3b=
%40isocpp.org</a>.<br />

------=_Part_332_1187150111.1533228603335--

------=_Part_331_593292463.1533228603333--

.


Author: florian.csdt@gmail.com
Date: Thu, 2 Aug 2018 13:12:10 -0700 (PDT)
Raw View
------=_Part_407_219985627.1533240730224
Content-Type: multipart/alternative;
 boundary="----=_Part_408_1518795344.1533240730226"

------=_Part_408_1518795344.1533240730226
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable



Le jeudi 2 ao=C3=BBt 2018 18:50:03 UTC+2, mihailn...@gmail.com a =C3=A9crit=
 :
>
>
>
> On Thursday, August 2, 2018 at 6:58:01 PM UTC+3, floria...@gmail.com=20
> wrote:
>>
>>
>>
>> Le jeudi 2 ao=C3=BBt 2018 17:23:06 UTC+2, mihailn...@gmail.com a =C3=A9c=
rit :
>>>
>>> *Quote=20
>>> from https://groups.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7Nr=
wnGQ/czTCvTkSDQAJ=20
>>> <https://groups.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ=
/czTCvTkSDQAJ>*
>>> =20
>>>
>>>> I was thinking about this one:=20
>>>> https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6r=
LutWGp4I=20
>>>>
>>>> So let me tell you what I was thinking:
>>>>
>>>> There exist a common, yet unutterable, where tag types live (lets call=
=20
>>>> it tag_ns to simplify).
>>>>
>>>> When you declare a function with tags:
>>>> int foo(tag_name: float f);
>>>> The compiler creates a tag type in this namespace called tag_name, and=
=20
>>>> transform the declaration like that:
>>>> int foo(tag_ns::tag_name, float f);
>>>>
>>>> When you call a function with a tag:
>>>> foo(tag_name: 1.f);
>>>> The compiler creates a tag type in this namespace called tag_name,=20
>>>> replaces the expression with a call like that (without even needing to=
 know=20
>>>> the declaration of the function):
>>>> foo(tag_ns::tag_name{}, 1.f);
>>>>
>>>> If two functions (even in different namespaces) use the same tag name,=
=20
>>>> they will have the same tag type, which is fine.
>>>>
>>>
>>> Yes, initially I was thinking names are names no matter the namespace,=
=20
>>> but I abandoned this.
>>>
>>> I abandoned it because tags are types, and are used for overload=20
>>> resolution. If the std has a tag named 'par' and I want to use this nam=
e=20
>>> but with different implementation, I must be able to do that, much like=
=20
>>> today
>>> We need namespaces for tags, and,  to the very least labels should be=
=20
>>> defined in the namespace of the functions.
>>>
>>
>> =20
>
>> The tag has no implementation, only the overload using the tag has an=20
>> implementation. So there is absolutely no problem here.
>> void foo(tag:);
>> void bar(tag:);
>>
>> Why tag in both cases couldn't be the same? We use nothing from those ta=
g=20
>> objects.
>>
>
> Tags are used for specialization of functions (parallel library is an=20
> example). I must be able to declare tags that are named the same as the s=
td=20
> ones, yet are different type and will pick my overload, not the std one.=
=20
>

I don't think it is necessary to be useful.
=20

>
> If we completely remove namespaces for tags people will be forced to go=
=20
> the C-way of naming to be able to create new type under the "same name" -=
=20
> cuda_parallel - to force new overload.
>

What do you gain with:
foo(cuda::parallel: ...);
over:
foo(cuda::parallel, ...);
?

If it is only to be able to put a colon here, then it is not worth the=20
effort.
Also, I really don't like the three colons.
=20

> =20
>
>>
>> How many real world code use non-empty classes as tags?=20
>>
> =20
>>
>>>
>>> But then I also abended automatic introduction...
>>>
>> =20
>>>
>>>> ...
>>>>
>>>> The main feature here would be the automatic introduction of types. A=
=20
>>>> bit like a template instantiation. It is implicit.
>>>>
>>>
>>> Automatic introduction is not that good of a barging - we invent new=20
>>> rules to save some typing, but new problems arise.=20
>>>
>>
>> What are those problems ?
>> If tag: refers to a single type wherever you are (even across TUs), then=
=20
>> what is the problem?
>> =20
>>
>>>
>>> Where are tags created? How can we make them template? How can we add=
=20
>>> attributes to them? Is this really new signature?
>>>
>>
>> First, I was thinking in an unutterable namespace, yet common to all TUs=
..
>> But then, making them an instantiation of std::tag<"tag_name"> might be=
=20
>> better.
>>
>> You don't add attributes to them because you don't need to. Do you add=
=20
>> attributes to the definition of std::string?
>> =20
>>
>>>
>>> *Sidenote*, how do you name the type to create a function signature?=20
>>> decltype(name:)? name: to mean different things in different contexts?=
=20
>>> Things escalate quickly.=20
>>>
>>
>> =20
>
>> When you declare a function, you would do:
>> void foo(tag_name:);
>> // or
>> // void foo(std::tag<"tag_name">);
>>
>> That's true name: would have different meaning depending on the context,=
=20
>> but that's would be the case anyway because of labels.
>>
>
> And what about std::function and pointers to functions? We will need to=
=20
> touch a lot of places to enable this syntax. =20
>

If by "a lot", you mean 3, I agree:
- parameter list of a function declarator
- call expression
- decltype expression (not even necessary)

int main() {
  // Parameter list of a function declarator
  int foo(name: int); // -> int foo(std::tag<"name">, int);
  std::function<int(name: int)> f =3D foo; // ->=20
std::function<int(std::tag<"name">, int)> f =3D foo;
  int (*g)(name: int) =3D static_cast<int(*)(name: int)>(&foo); // -> int=
=20
(*g)(std::tag<"name">, int) =3D static_cast<int(*)(std::tag<"name">,=20
int)>(&foo);
  using foo_t =3D int(name: int); // -> int(std::tag<"name">, int)

  // call expression
  foo(name: 1); // -> foo(std::tag<"name">{}, 1);

  // decltype expression
  decltype(name:) h; // -> std::tag<"name"> h;
}

This is the beauty of this: by modifying slightly the language at 3 places,=
=20
it works nicely. There is no complicated rules.
If name: appears in a parameter list of a function declarator, replace it=
=20
with std::tag<"name">,
If name: appears in a call expression, replace it with std::tag<"name">{},
if decltype(name:), replace the whole decltype expression with=20
std::tag<"name">

You also need to define the class template std::tag, but that will be=20
trivial.


> Also note that we will need extra rules what introduces and what just=20
> names a label. And these are not trivial, we can't always blindly=20
> introduce.=20
>
Makes no sense to introduce a type by declaring a function pointer, even if=
=20
> we agree to not have namespaces for them.
>

If you need a tag, you need a tag even when declaring a function pointer.
And yes, we can blindly introduce tag types. How is it different from=20
template instatiation?

=20

>
> =20
>
>> And actually, when declaring a function and when using it, they don't=20
>> mean the same language construct, but still have a common meaning: they =
are=20
>> tags.
>> So only the translation would be different, not the meaning.
>>
>> Actually, with decltype(name:), whatever the translation of name: would=
=20
>> be (type or object of that type), the result is still the same.
>>
>> =20
>>
>>>
>>> In the end, I made it all as conservative as possible and as much based=
=20
>>> on current practice as possible. The initial simplicity was deceiving,=
=20
>>> because it was just a morning idea.
>>>
>>
>> On the contrary, the initial simplicity was great. I think you shouldn't=
=20
>> have tried to solve its issues by making more complex, but on the contra=
ry=20
>> making it more simple (like I did).
>>
>
>
> It is more simple, in the sense, it maps 100% on to established practice=
=20
> and 95+% on current types, declarations, scope, etc, rules=20
>

What you say is not simpler, it is more complete.
When I say simpler, I mean the rules are simpler (a smaller wording).
I never said that my proposition covers as much as yours.
=20

>
> =20
>
>> =20
>>
>>>
>>> This is not to say we could not use some shortcut syntax.
>>>
>>> We could
>>>
>>> int foo(tag_name: float f);
>>>
>>> generate
>>>
>>> case struct tag_name; //< enclosing scope
>>> int foo(case tag_name, float f);
>>>
>>> But I still question the pros/cons ratio.=20
>>>
>>>
>>>
>>>
>>>> In your first proposal, you mentioned you wanted to be able to do=20
>>>> something like that:
>>>> any(in_place<string>: "");
>>>> I don't think it is useful. you are not naming an argument here.
>>>>
>>>
>>> In *most* cases tags are used it is not as if the argument is named.=20
>>>
>>
>> =20
>
>> True, tags are not names.
>> Avoiding this use case makes the design very simple.
>> Much simpler than all the alternatives you tried.
>>
>
> Why should I avoid this case, I don't understand? The colon is perfectly=
=20
> deducible in different contexts to mean slightly different things, but it=
=20
> *always *stands for a clarification.=20
>

Here, it is not the colon the problem, but the arbitrary expression on the=
=20
left of the colon.
Supporting only arbitrary identifier tokens on the left of the colon=20
simplifies very much the wording of the feature: the rules are easy.
=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.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/1901542c-d377-409a-9a53-b4c6a91638ea%40isocpp.or=
g.

------=_Part_408_1518795344.1533240730226
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>Le jeudi 2 ao=C3=BBt 2018 18:50:03 UTC+2, mihailn.=
...@gmail.com a =C3=A9crit=C2=A0:<blockquote class=3D"gmail_quote" style=3D"=
margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;=
"><div dir=3D"ltr"><br><br>On Thursday, August 2, 2018 at 6:58:01 PM UTC+3,=
 <a>floria...@gmail.com</a> wrote:<blockquote class=3D"gmail_quote" style=
=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"=
><div dir=3D"ltr"><br><br>Le jeudi 2 ao=C3=BBt 2018 17:23:06 UTC+2, <a>miha=
iln...@gmail.com</a> a =C3=A9crit=C2=A0:<blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:=
1ex"><div dir=3D"ltr"><div><b>Quote from=C2=A0<a href=3D"https://groups.goo=
gle.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/czTCvTkSDQAJ" rel=3D"n=
ofollow" target=3D"_blank" onmousedown=3D"this.href=3D&#39;https://groups.g=
oogle.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/czTCvTkSDQAJ&#39;;re=
turn true;" onclick=3D"this.href=3D&#39;https://groups.google.com/a/isocpp.=
org/d/msg/std-proposals/wz0a7NrwnGQ/czTCvTkSDQAJ&#39;;return true;">https:/=
/groups.google.<wbr>com/a/isocpp.org/d/msg/std-<wbr>proposals/wz0a7NrwnGQ/<=
wbr>czTCvTkSDQAJ</a></b></div><div>=C2=A0</div><blockquote class=3D"gmail_q=
uote" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:=
rgb(204,204,204);border-left-width:1px;border-left-style:solid"><div>I was =
thinking about this one: <a style=3D"border-bottom-color:rgb(17,85,204);bor=
der-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(17,85,2=
04);border-left-style:none;border-left-width:0px;border-right-color:rgb(17,=
85,204);border-right-style:none;border-right-width:0px;border-top-color:rgb=
(17,85,204);border-top-style:none;border-top-width:0px;color:rgb(17,85,204)=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-decorati=
on:none" href=3D"https://groups.google.com/a/isocpp.org/forum/#!topic/std-p=
roposals/O6rLutWGp4I" rel=3D"nofollow" target=3D"_blank" onmousedown=3D"thi=
s.href=3D&#39;https://groups.google.com/a/isocpp.org/forum/#!topic/std-prop=
osals/O6rLutWGp4I&#39;;return true;" onclick=3D"this.href=3D&#39;https://gr=
oups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I&#39;;r=
eturn true;">https://groups.google.com/a/<wbr>isocpp.org/forum/#!topic/std-=
<wbr>proposals/O6rLutWGp4I</a> <br style=3D"border-bottom-color:rgb(34,34,3=
4);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(3=
4,34,34);border-left-style:none;border-left-width:0px;border-right-color:rg=
b(34,34,34);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,3=
4);line-height:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;ma=
rgin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-=
top:0px"></div><div><br style=3D"border-bottom-color:rgb(34,34,34);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);bo=
rder-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34)=
;border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,=
34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34);line-hei=
ght:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></=
div><div>So let me tell you what I was thinking:</div><div><br style=3D"bor=
der-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width=
:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-wid=
th:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-righ=
t-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top=
-width:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px"></div><div>There exist a common, yet u=
nutterable, where tag types live (lets call it tag_ns to simplify).</div><d=
iv><br style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;=
border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-sty=
le:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-st=
yle:none;border-top-width:0px;color:rgb(34,34,34);line-height:normal;margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:=
0px;padding-left:0px;padding-right:0px;padding-top:0px"></div><div>When you=
 declare a function with tags:</div><div><div style=3D"background-color:rgb=
(250,250,250);border-bottom-color:rgb(187,187,187);border-bottom-style:soli=
d;border-bottom-width:1px;border-left-color:rgb(187,187,187);border-left-st=
yle:solid;border-left-width:1px;border-right-color:rgb(187,187,187);border-=
right-style:solid;border-right-width:1px;border-top-color:rgb(187,187,187);=
border-top-style:solid;border-top-width:1px;margin-bottom:0px;margin-left:0=
px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padd=
ing-right:0px;padding-top:0px"><code style=3D"border-bottom-color:rgb(34,34=
,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb=
(34,34,34);border-left-style:none;border-left-width:0px;border-right-color:=
rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-col=
or:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bottom-=
color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border=
-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;bord=
er-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0px=
;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><span style=
=3D"border-bottom-color:rgb(0,0,136);border-bottom-style:none;border-bottom=
-width:0px;border-left-color:rgb(0,0,136);border-left-style:none;border-lef=
t-width:0px;border-right-color:rgb(0,0,136);border-right-style:none;border-=
right-width:0px;border-top-color:rgb(0,0,136);border-top-style:none;border-=
top-width:0px;color:rgb(0,0,136);margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px">int</span><span style=3D"border-bottom-color:rgb(0,0,0)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0=
,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(0,0=
,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(0,0=
,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px"> foo</span><span style=
=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:none=
;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px">(</span><span style=3D"border-bottom-color:rg=
b(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-color=
:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px">tag_name</span><=
span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;b=
order-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(102,102,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-=
style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;marg=
in-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left=
:0px;padding-right:0px;padding-top:0px">:</span><span style=3D"border-botto=
m-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(=
0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"> </spa=
n><span style=3D"border-bottom-color:rgb(0,0,136);border-bottom-style:none;=
border-bottom-width:0px;border-left-color:rgb(0,0,136);border-left-style:no=
ne;border-left-width:0px;border-right-color:rgb(0,0,136);border-right-style=
:none;border-right-width:0px;border-top-color:rgb(0,0,136);border-top-style=
:none;border-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px">float</span><span style=3D"border-bottom-c=
olor:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-to=
p-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0=
,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"> f</span>=
<span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;=
border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:=
none;border-left-width:0px;border-right-color:rgb(102,102,0);border-right-s=
tyle:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-top=
-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;mar=
gin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-lef=
t:0px;padding-right:0px;padding-top:0px">);</span><span style=3D"border-bot=
tom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rg=
b(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;=
padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br =
style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bot=
tom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-le=
ft-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top=
-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></=
span></div></code></div>The compiler creates a tag type in this namespace c=
alled tag_name, and transform the declaration like that:</div><div><div sty=
le=3D"background-color:rgb(250,250,250);border-bottom-color:rgb(187,187,187=
);border-bottom-style:solid;border-bottom-width:1px;border-left-color:rgb(1=
87,187,187);border-left-style:solid;border-left-width:1px;border-right-colo=
r:rgb(187,187,187);border-right-style:solid;border-right-width:1px;border-t=
op-color:rgb(187,187,187);border-top-style:solid;border-top-width:1px;margi=
n-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom=
:0px;padding-left:0px;padding-right:0px;padding-top:0px"><code style=3D"bor=
der-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width=
:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-wid=
th:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-righ=
t-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top=
-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><d=
iv style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;=
border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:n=
one;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:=
none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px"><span style=3D"border-bottom-color:rgb(0,0,136);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(0,0,136);border-le=
ft-style:none;border-left-width:0px;border-right-color:rgb(0,0,136);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(0,0,136);borde=
r-top-style:none;border-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;=
margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-=
left:0px;padding-right:0px;padding-top:0px">int</span><span style=3D"border=
-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bo=
rder-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;colo=
r:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:=
0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">=
 foo</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-=
left-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);bor=
der-right-style:none;border-right-width:0px;border-top-color:rgb(102,102,0)=
;border-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bot=
tom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px">(</span><span style=3D"=
border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width=
:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:=
0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-widt=
h:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0p=
x;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margi=
n-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top=
:0px">tag_ns</span><span style=3D"border-bottom-color:rgb(102,102,0);border=
-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0)=
;border-left-style:none;border-left-width:0px;border-right-color:rgb(102,10=
2,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(10=
2,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bot=
tom:0px;padding-left:0px;padding-right:0px;padding-top:0px">::</span><span =
style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bot=
tom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-le=
ft-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top=
-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px">tag_name</span><span style=3D"border-bottom-color:rgb(102,10=
2,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb=
(102,102,0);border-left-style:none;border-left-width:0px;border-right-color=
:rgb(102,102,0);border-right-style:none;border-right-width:0px;border-top-c=
olor:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(10=
2,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;=
padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">,</s=
pan><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;=
border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none=
;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;=
border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px"> </span><span style=3D"border-bottom-color:rgb(0,0=
,136);border-bottom-style:none;border-bottom-width:0px;border-left-color:rg=
b(0,0,136);border-left-style:none;border-left-width:0px;border-right-color:=
rgb(0,0,136);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(0,0,136);border-top-style:none;border-top-width:0px;color:rgb(0,0,136=
);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">float</span=
><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bor=
der-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px"> f</span><span style=3D"border-bottom-color:rgb(102,1=
02,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rg=
b(102,102,0);border-left-style:none;border-left-width:0px;border-right-colo=
r:rgb(102,102,0);border-right-style:none;border-right-width:0px;border-top-=
color:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(1=
02,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">);<=
/span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:non=
e;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:no=
ne;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:n=
one;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:non=
e;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;m=
argin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-=
right:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);bord=
er-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);b=
order-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);b=
order-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px"></span></div></code></div></div><div><br style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;=
margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-=
left:0px;padding-right:0px;padding-top:0px"></div><div>When you call a func=
tion with a tag:</div><div><div style=3D"background-color:rgb(250,250,250);=
border-bottom-color:rgb(187,187,187);border-bottom-style:solid;border-botto=
m-width:1px;border-left-color:rgb(187,187,187);border-left-style:solid;bord=
er-left-width:1px;border-right-color:rgb(187,187,187);border-right-style:so=
lid;border-right-width:1px;border-top-color:rgb(187,187,187);border-top-sty=
le:solid;border-top-width:1px;margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px"><code style=3D"border-bottom-color:rgb(34,34,34);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);bor=
der-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,3=
4);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,3=
4,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rg=
b(34,34,34);border-left-style:none;border-left-width:0px;border-right-color=
:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-co=
lor:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px"><span style=3D"border-botto=
m-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(=
0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">foo</s=
pan><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:n=
one;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-st=
yle:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-rig=
ht-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);border=
-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px=
;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding=
-left:0px;padding-right:0px;padding-top:0px">(</span><span style=3D"border-=
bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bo=
rder-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bor=
der-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;b=
order-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color=
:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0=
px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">t=
ag_name</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);bord=
er-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(102,102=
,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px">:</span><span style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;m=
argin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding=
-top:0px"> </span><span style=3D"border-bottom-color:rgb(0,102,102);border-=
bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,102,102);=
border-left-style:none;border-left-width:0px;border-right-color:rgb(0,102,1=
02);border-right-style:none;border-right-width:0px;border-top-color:rgb(0,1=
02,102);border-top-style:none;border-top-width:0px;color:rgb(0,102,102);mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px">1.f</span><span =
style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;b=
order-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:n=
one;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-style=
:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px">);</span><span style=3D"border-bottom-co=
lor:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left=
-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right=
-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,=
0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span>=
</div></code></div></div><div>The
 compiler creates a tag type in this namespace called tag_name, replaces
 the expression with a call like that (without even needing to know the=20
declaration of the function):</div><div><div style=3D"background-color:rgb(=
250,250,250);border-bottom-color:rgb(187,187,187);border-bottom-style:solid=
;border-bottom-width:1px;border-left-color:rgb(187,187,187);border-left-sty=
le:solid;border-left-width:1px;border-right-color:rgb(187,187,187);border-r=
ight-style:solid;border-right-width:1px;border-top-color:rgb(187,187,187);b=
order-top-style:solid;border-top-width:1px;margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px"><code style=3D"border-bottom-color:rgb(34,34,=
34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(=
34,34,34);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(34,34,34);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0p=
x;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddin=
g-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bottom-c=
olor:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><span style=3D=
"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width=
:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0=
px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">foo</span><span style=3D"border-bottom-color:rgb(102,102,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,=
0);border-right-style:none;border-right-width:0px;border-top-color:rgb(102,=
102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px">(</span><span sty=
le=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom=
-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-=
width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-righ=
t-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-wi=
dth:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px">tag_ns</span><span style=3D"border-bottom-color:rgb(102,102,0);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,=
102,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
102,102,0);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102=
,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">::</span>=
<span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bord=
er-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-=
right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:=
0px;padding-top:0px">tag_name</span><span style=3D"border-bottom-color:rgb(=
102,102,0);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-right=
-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:=
rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
">{},</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-st=
yle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-s=
tyle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-sty=
le:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px"> </span><span style=3D"border-bottom-color=
:rgb(0,102,102);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(0,102,102);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(0,102,102);border-right-style:none;border-right-width:0px;b=
order-top-color:rgb(0,102,102);border-top-style:none;border-top-width:0px;c=
olor:rgb(0,102,102);margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">1.f</span><span style=3D"border-bottom-color:rgb(102,102,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,=
0);border-right-style:none;border-right-width:0px;border-top-color:rgb(102,=
102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px">);</span><span st=
yle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left=
-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-rig=
ht-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-w=
idth:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-styl=
e:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px"></span></div></code></div><br style=3D"border-bottom-color:r=
gb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:r=
gb(34,34,34);line-height:normal;margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px">If two functions (even in different namespaces) use the =
same tag name, they will have the same tag type, which is fine.</div></bloc=
kquote><div><br></div><div>Yes, initially I was thinking names are names no=
 matter the namespace, but I <span style=3D"display:inline!important;float:=
none;background-color:transparent;color:rgb(34,34,34);font-family:&quot;Ari=
al&quot;,&quot;Helvetica&quot;,sans-serif;font-size:13px;font-style:normal;=
font-variant:normal;font-weight:400;letter-spacing:normal;text-align:left;t=
ext-decoration:none;text-indent:0px;text-transform:none;white-space:normal;=
word-spacing:0px">abandoned </span>this.</div><div><br></div><div>I abandon=
ed it because tags are types, and are used for overload resolution. If the =
std has a tag named &#39;par&#39; and I want to use this name but with diff=
erent implementation, I must be able to do that, much like today</div><div>=
We need namespaces for tags, and,=C2=A0 to the very least labels should be =
defined in the namespace of the functions.</div></div></blockquote><div><br=
></div></div></blockquote><div>=C2=A0</div><blockquote class=3D"gmail_quote=
" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-le=
ft:1ex"><div dir=3D"ltr"><div></div><div>The tag has no implementation, onl=
y the overload using the tag has an implementation. So there is absolutely =
no problem here.</div><div><div style=3D"background-color:rgb(250,250,250);=
border-color:rgb(187,187,187);border-style:solid;border-width:1px"><code><d=
iv><span style=3D"color:#008">void</span><span style=3D"color:#000"> foo</s=
pan><span style=3D"color:#660">(</span><span style=3D"color:#000">tag</span=
><span style=3D"color:#660">:);</span><span style=3D"color:#000"><br></span=
><span style=3D"color:#008">void</span><span style=3D"color:#000"> bar</spa=
n><span style=3D"color:#660">(</span><span style=3D"color:#000">tag</span><=
span style=3D"color:#660">:);</span><span style=3D"color:#000"><br></span><=
/div></code></div></div><div><br></div><div>Why tag in both cases couldn&#3=
9;t be the same? We use nothing from those tag objects.</div></div></blockq=
uote><div><br></div><div>Tags are used for specialization of functions (par=
allel library is an example). I must be able to declare tags that are named=
 the same as the std ones, yet are different type and will pick my overload=
, not the std one.=C2=A0</div></div></blockquote><div><br></div><div>I don&=
#39;t think it is necessary to be useful.<br></div><div>=C2=A0</div><blockq=
uote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-lef=
t: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><br></div><div>=
If we completely remove namespaces for tags people will be forced to go the=
 C-way of naming to be able to create new type under the &quot;same name&qu=
ot; - cuda_parallel - to force new overload.</div></div></blockquote><div><=
br></div><div>What do you gain with:</div><div><div style=3D"background-col=
or: rgb(250, 250, 250); border-color: rgb(187, 187, 187); border-style: sol=
id; border-width: 1px; overflow-wrap: break-word;" class=3D"prettyprint"><c=
ode class=3D"prettyprint"><div class=3D"subprettyprint"><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify">foo</span><span style=3D"color: #660=
;" class=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify">cuda</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">::</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify">parallel</span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">:</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> =
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">...);</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></span></di=
v></code></div>over:</div><div><div style=3D"background-color: rgb(250, 250=
, 250); border-color: rgb(187, 187, 187); border-style: solid; border-width=
: 1px; overflow-wrap: break-word;" class=3D"prettyprint"><code class=3D"pre=
ttyprint"><div class=3D"subprettyprint"><span style=3D"color: #000;" class=
=3D"styled-by-prettify">foo</span><span style=3D"color: #660;" class=3D"sty=
led-by-prettify">(</span><span style=3D"color: #000;" class=3D"styled-by-pr=
ettify">cuda</span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">::</span><span style=3D"color: #000;" class=3D"styled-by-prettify">parall=
el</span><span style=3D"color: #660;" class=3D"styled-by-prettify">,</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span sty=
le=3D"color: #660;" class=3D"styled-by-prettify">...);</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify"><br></span></div></code></div><=
/div><div>?<br></div><div><br></div><div>If it is only to be able to put a =
colon here, then it is not worth the effort.<br>Also, I really don&#39;t li=
ke the three colons.<br></div><div>=C2=A0</div><blockquote class=3D"gmail_q=
uote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;pad=
ding-left: 1ex;"><div dir=3D"ltr"><div>=C2=A0</div><blockquote class=3D"gma=
il_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;pa=
dding-left:1ex"><div dir=3D"ltr"><div><br></div><div>How many real world co=
de use non-empty classes as tags?=C2=A0</div></div></blockquote><blockquote=
 class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px =
#ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>=C2=A0</div><=
blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border=
-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div=
>But then I also abended automatic introduction...<br></div></div></blockqu=
ote><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;b=
order-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><di=
v>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px=
 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-widt=
h:1px;border-left-style:solid"><div>...</div><div><div style=3D"border-bott=
om-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(34,34,34);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0=
px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;=
margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-=
left:0px;padding-right:0px;padding-top:0px"></div><div style=3D"border-bott=
om-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(34,34,34);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0=
px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">The main f=
eature here would be the automatic introduction of types. A bit like a temp=
late instantiation. It is implicit.<br style=3D"border-bottom-color:rgb(34,=
34,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:r=
gb(34,34,34);border-left-style:none;border-left-width:0px;border-right-colo=
r:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-c=
olor:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,=
34,34);line-height:normal;margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px"></div></div></blockquote><div><br></div><div>Automatic introdu=
ction is not that good of a barging - we invent new rules to save some typi=
ng, but new problems arise.=C2=A0</div></div></blockquote><div><br></div><d=
iv>What are those problems ?</div><div>If tag: refers to a single type wher=
ever you are (even across TUs), then what is the problem?<br></div><div>=C2=
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.=
8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br>=
</div><div>Where are tags created? How can we make them template? How can w=
e add attributes to them? Is this really new signature?</div></div></blockq=
uote><div><br></div><div>First, I was thinking in an unutterable namespace,=
 yet common to all TUs.</div><div>But then, making them an instantiation of=
 std::tag&lt;&quot;tag_name&quot;&gt; might be better.<br></div><div><br></=
div><div>You don&#39;t add attributes to them because you don&#39;t need to=
.. Do you add attributes to the definition of std::string?<br></div><div>=C2=
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.=
8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br>=
</div><div><b>Sidenote</b>, how do you name the type to create a function s=
ignature?<font face=3D"courier new,monospace"> decltype(name:)</font>? <fon=
t face=3D"courier new,monospace">name:</font> to mean different things in d=
ifferent contexts? Things escalate quickly.=C2=A0</div></div></blockquote><=
div><br></div></div></blockquote><div>=C2=A0</div><blockquote class=3D"gmai=
l_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;pad=
ding-left:1ex"><div dir=3D"ltr"><div></div><div>When you declare a function=
, you would do:</div><div><div style=3D"background-color:rgb(250,250,250);b=
order-color:rgb(187,187,187);border-style:solid;border-width:1px"><code><di=
v><span style=3D"color:#008">void</span><span style=3D"color:#000"> foo</sp=
an><span style=3D"color:#660">(</span><span style=3D"color:#000">tag_name</=
span><span style=3D"color:#660">:);</span><span style=3D"color:#000"><br></=
span><span style=3D"color:#800">// or</span><span style=3D"color:#000"><br>=
</span><span style=3D"color:#800">// void foo(std::tag&lt;&quot;tag_name&qu=
ot;&gt;);</span><span style=3D"color:#000"><br></span></div></code></div><b=
r></div><div>That&#39;s true <span style=3D"font-family:courier new,monospa=
ce">name:</span> would have different meaning depending on the context, but=
 that&#39;s would be the case anyway because of labels.</div></div></blockq=
uote><div><br></div><div>And what about std::function and pointers to funct=
ions? We will need to touch a lot of places to enable this syntax. =C2=A0</=
div></div></blockquote><div><br></div><div>If by &quot;a lot&quot;, you mea=
n 3, I agree:</div><div>- parameter list of a function declarator<br><div>-=
 call expression</div><div>- decltype expression (not even necessary)<br></=
div></div><div><br></div><div><div style=3D"background-color: rgb(250, 250,=
 250); border-color: rgb(187, 187, 187); border-style: solid; border-width:=
 1px; overflow-wrap: break-word;" class=3D"prettyprint"><code class=3D"pret=
typrint"><div class=3D"subprettyprint"><span style=3D"color: #008;" class=
=3D"styled-by-prettify">int</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> main</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">()</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">{</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </s=
pan><span style=3D"color: #800;" class=3D"styled-by-prettify">// Parameter =
list of a function declarator</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #008;" class=3D"=
styled-by-prettify">int</span><span style=3D"color: #000;" class=3D"styled-=
by-prettify"> foo</span><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify">(</span><span style=3D"color: #000;" class=3D"styled-by-prettify">na=
me</span><span style=3D"color: #660;" class=3D"styled-by-prettify">:</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span sty=
le=3D"color: #008;" class=3D"styled-by-prettify">int</span><span style=3D"c=
olor: #660;" class=3D"styled-by-prettify">);</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"> </span><span style=3D"color: #800;" clas=
s=3D"styled-by-prettify">// -&gt; int foo(std::tag&lt;&quot;name&quot;&gt;,=
 int);</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=
=C2=A0 std</span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
::</span><span style=3D"color: #008;" class=3D"styled-by-prettify">function=
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">&lt;</span=
><span style=3D"color: #008;" class=3D"styled-by-prettify">int</span><span =
style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify">name</span><span style=3D"color:=
 #660;" class=3D"styled-by-prettify">:</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"> </span><span style=3D"color: #008;" class=3D"s=
tyled-by-prettify">int</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">)&gt;</span><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify"> f </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> foo</s=
pan><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D=
"color: #800;" class=3D"styled-by-prettify">// -&gt; std::function&lt;int(s=
td::tag&lt;&quot;name&quot;&gt;, int)&gt; f =3D foo;</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"=
color: #008;" class=3D"styled-by-prettify">int</span><span style=3D"color: =
#000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" cl=
ass=3D"styled-by-prettify">(*</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify">g</span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">)(</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
">name</span><span style=3D"color: #660;" class=3D"styled-by-prettify">:</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span=
 style=3D"color: #008;" class=3D"styled-by-prettify">int</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">)</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" =
class=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><span style=3D"color: #008;" class=3D"style=
d-by-prettify">static_cast</span><span style=3D"color: #660;" class=3D"styl=
ed-by-prettify">&lt;</span><span style=3D"color: #008;" class=3D"styled-by-=
prettify">int</span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">(*)(</span><span style=3D"color: #000;" class=3D"styled-by-prettify">nam=
e</span><span style=3D"color: #660;" class=3D"styled-by-prettify">:</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span styl=
e=3D"color: #008;" class=3D"styled-by-prettify">int</span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">)&gt;(&amp;</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify">foo</span><span style=3D"color: #=
660;" class=3D"styled-by-prettify">);</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify"> </span><span style=3D"color: #800;" class=3D"st=
yled-by-prettify">// -&gt; int (*g)(std::tag&lt;&quot;name&quot;&gt;, int) =
=3D static_cast&lt;int(*)(std::tag&lt;&quot;name&quot;&gt;, int)&gt;(&amp;f=
oo);</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=
=C2=A0 </span><span style=3D"color: #008;" class=3D"styled-by-prettify">usi=
ng</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> foo_t <=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">=3D</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span styl=
e=3D"color: #008;" class=3D"styled-by-prettify">int</span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #000=
;" class=3D"styled-by-prettify">name</span><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">:</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> </span><span style=3D"color: #008;" class=3D"styled-by-pr=
ettify">int</span><span style=3D"color: #660;" class=3D"styled-by-prettify"=
>);</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span=
><span style=3D"color: #800;" class=3D"styled-by-prettify">// -&gt; int(std=
::tag&lt;&quot;name&quot;&gt;, int)</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"><br><br>=C2=A0 </span><span style=3D"color: #800;"=
 class=3D"styled-by-prettify">// call expression</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br>=C2=A0 foo</span><span style=3D"c=
olor: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify">name</span><span style=3D"color: #660;" cl=
ass=3D"styled-by-prettify">:</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> </span><span style=3D"color: #066;" class=3D"styled-by-p=
rettify">1</span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
);</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span>=
<span style=3D"color: #800;" class=3D"styled-by-prettify">// -&gt; foo(std:=
:tag&lt;&quot;name&quot;&gt;{}, 1);</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"><br><br>=C2=A0 </span><span style=3D"color: #800;"=
 class=3D"styled-by-prettify">// decltype expression</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"=
color: #008;" class=3D"styled-by-prettify">decltype</span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #000=
;" class=3D"styled-by-prettify">name</span><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">:)</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> h</span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
> </span><span style=3D"color: #800;" class=3D"styled-by-prettify">// -&gt;=
 std::tag&lt;&quot;name&quot;&gt; h;</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"><br></span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">}</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"><br></span></div></code></div></div><div><br></div><div>This is =
the beauty of this: by modifying slightly the language at 3 places, it work=
s nicely. There is no complicated rules.</div><div>If <span style=3D"font-f=
amily: courier new, monospace;">name:</span> appears in a parameter list of=
 a function declarator, replace it with <span style=3D"font-family: courier=
 new, monospace;">std::tag&lt;&quot;name&quot;&gt;,</span></div><div>If <sp=
an style=3D"font-family: courier new, monospace;">name:</span> appears in a=
 call expression, replace it with <span style=3D"font-family: courier new, =
monospace;">std::tag&lt;&quot;name&quot;&gt;{},</span></div><div>if <span s=
tyle=3D"font-family: courier new, monospace;">decltype(name:)</span>, repla=
ce the whole <span style=3D"font-family: courier new, monospace;">decltype<=
/span> expression with <span style=3D"font-family: courier new, monospace;"=
>std::tag&lt;&quot;name&quot;&gt;</span><br></div><div><br></div><div>You a=
lso need to define the class template <span style=3D"font-family: courier n=
ew, monospace;">std::tag</span>, but that will be trivial.</div><div><br></=
div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex=
;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><br>=
</div><div>Also note that we will need extra rules what introduces and what=
 just names a label. And these are not trivial, we can&#39;t always blindly=
 introduce.=C2=A0</div></div></blockquote><blockquote class=3D"gmail_quote"=
 style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-=
left: 1ex;"><div dir=3D"ltr"><div>Makes no sense to introduce a type by dec=
laring a function pointer, even if we agree to not have namespaces for them=
..</div></div></blockquote><div><div><br></div>If you need a tag, you need a=
 tag even when declaring a function pointer.</div><div>And yes, we can blin=
dly introduce tag types. How is it different from template instatiation?</d=
iv><br><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: =
0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div d=
ir=3D"ltr"><div><br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote=
" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-le=
ft:1ex"><div dir=3D"ltr"><div>And actually, when declaring a function and w=
hen using it, they don&#39;t mean the same language construct, but still ha=
ve a common meaning: they are tags.</div><div>So only the translation would=
 be different, not the meaning.</div><div><br></div><div>Actually, with <sp=
an style=3D"font-family:courier new,monospace">decltype(name:)</span>, what=
ever the translation of <span style=3D"font-family:courier new,monospace">n=
ame:</span> would be (type or object of that type), the result is still the=
 same.<br></div><div><br></div><div>=C2=A0</div><blockquote class=3D"gmail_=
quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;paddi=
ng-left:1ex"><div dir=3D"ltr"><div><br></div><div>In the end, I made it all=
 as conservative as possible and as much based on current practice as possi=
ble. The initial simplicity was deceiving, because it was just a morning id=
ea.</div></div></blockquote><div><br></div><div>On the contrary, the initia=
l simplicity was great. I think you shouldn&#39;t have tried to solve its i=
ssues by making more complex, but on the contrary making it more simple (li=
ke I did).<br></div></div></blockquote><div><br></div><div><br></div><div>I=
t is more simple, in the sense, it maps 100% on to established practice and=
 95+% on current types, declarations, scope, etc, rules=C2=A0<br></div></di=
v></blockquote><div><br></div><div>What you say is not simpler, it is more =
complete.<br></div><div>When I say simpler, I mean the rules are simpler (a=
 smaller wording).</div><div>I never said that my proposition covers as muc=
h as yours.<br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" sty=
le=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left=
: 1ex;"><div dir=3D"ltr"><div></div><div><br></div><div>=C2=A0</div><blockq=
uote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:=
1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>=C2=A0</d=
iv><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bo=
rder-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div>=
<div>This is not to say we could not use some shortcut syntax.</div><div><b=
r></div><div>We could</div><div><br></div><font face=3D"courier new,monospa=
ce">int foo(tag_name: float f);</font><div><br></div><div>generate</div><di=
v><br></div><div><span style=3D"text-align:left;color:rgb(34,34,34);text-tr=
ansform:none;text-indent:0px;letter-spacing:normal;font-size:13px;font-styl=
e:normal;font-variant:normal;font-weight:400;text-decoration:none;word-spac=
ing:0px;display:inline!important;white-space:normal;float:none;background-c=
olor:transparent"><font face=3D"courier new,monospace">case struct tag_name=
; //&lt; enclosing scope</font></span><b></b><i></i><u></u><sub></sub><sup>=
</sup><strike></strike><br></div><div><font face=3D"courier new,monospace">=
i<span style=3D"text-align:left;color:rgb(34,34,34);text-transform:none;tex=
t-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal;font-va=
riant:normal;font-weight:400;text-decoration:none;word-spacing:0px;display:=
inline!important;white-space:normal;float:none;background-color:transparent=
">nt foo(case tag_name, float f);</span></font></div><div><font face=3D"cou=
rier new,monospace"><span style=3D"text-align:left;color:rgb(34,34,34);text=
-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px;font-s=
tyle:normal;font-variant:normal;font-weight:400;text-decoration:none;word-s=
pacing:0px;display:inline!important;white-space:normal;float:none;backgroun=
d-color:transparent"><br></span></font></div><div><span style=3D"text-align=
:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacin=
g:normal;font-size:13px;font-style:normal;font-variant:normal;font-weight:4=
00;text-decoration:none;word-spacing:0px;display:inline!important;white-spa=
ce:normal;float:none;background-color:transparent"><font face=3D"arial,sans=
-serif">But I still question the pros/cons ratio.=C2=A0</font></span></div>=
<div><font face=3D"courier new,monospace"></font><br></div><div><b></b><i><=
/i><u></u><sub></sub><sup></sup><strike></strike><font face=3D"courier new,=
monospace"></font><br></div><div><br></div><blockquote class=3D"gmail_quote=
" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(=
204,204,204);border-left-width:1px;border-left-style:solid"><div><div style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px"></div><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bord=
er-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(34,34,34);bo=
rder-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,=
34);border-left-style:none;border-left-width:0px;border-right-color:rgb(34,=
34,34);border-right-style:none;border-right-width:0px;border-top-color:rgb(=
34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34);li=
ne-height:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px"></div><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);borde=
r-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px">In your first proposal, you mentioned you wanted t=
o be able to do something like that:</div><div style=3D"border-bottom-color=
:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left=
-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-ri=
ght-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margi=
n-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom=
:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div style=3D"back=
ground-color:rgb(250,250,250);border-bottom-color:rgb(187,187,187);border-b=
ottom-style:solid;border-bottom-width:1px;border-left-color:rgb(187,187,187=
);border-left-style:solid;border-left-width:1px;border-right-color:rgb(187,=
187,187);border-right-style:solid;border-right-width:1px;border-top-color:r=
gb(187,187,187);border-top-style:solid;border-top-width:1px;margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px"><code style=3D"border-bottom=
-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;bor=
der-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0p=
x;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px"><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none=
;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:non=
e;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:no=
ne;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none=
;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px">any</span><span style=3D"border-bottom-color:rgb(=
102,102,0);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-right=
-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:=
rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
">(</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-styl=
e:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-sty=
le:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style=
:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0=
px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padd=
ing-right:0px;padding-top:0px">in_place</span><span style=3D"border-bottom-=
color:rgb(0,136,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(0,136,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(0,136,0);border-right-style:none;border-right-width:0px;bo=
rder-top-color:rgb(0,136,0);border-top-style:none;border-top-width:0px;colo=
r:rgb(0,136,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
">&lt;string&gt;</span><span style=3D"border-bottom-color:rgb(102,102,0);bo=
rder-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,10=
2,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(10=
2,102,0);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0=
);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">:</span><sp=
an style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-=
bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;borde=
r-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-=
top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-rig=
ht:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px=
;padding-top:0px"> </span><span style=3D"border-bottom-color:rgb(0,136,0);b=
order-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,136=
,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(0,1=
36,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(0=
,136,0);border-top-style:none;border-top-width:0px;color:rgb(0,136,0);margi=
n-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom=
:0px;padding-left:0px;padding-right:0px;padding-top:0px">&quot;&quot;</span=
><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none=
;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style=
:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-to=
p-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px">);</span><span style=3D"border-bo=
ttom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bord=
er-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bor=
der-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:r=
gb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br=
 style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-=
right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-to=
p-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0=
px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><=
/span></div></code></div>I don&#39;t think it is useful. you are not naming=
 an argument here.</div></div></blockquote><div><br></div><div>In <i>most</=
i> cases tags are used it is not as if the argument is named.=C2=A0</div></=
div></blockquote><div><br></div></div></blockquote><div>=C2=A0</div><blockq=
uote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:=
1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>True, tag=
s are not names.</div><div>Avoiding this use case makes the design very sim=
ple.</div><div>Much simpler than all the alternatives you tried.</div></div=
></blockquote><div><br></div><div>Why should I avoid this case, I don&#39;t=
 understand? The colon is perfectly deducible in different contexts to mean=
 slightly different things, but it <i>always=C2=A0</i>stands for a clarific=
ation. <br></div></div></blockquote><div><br></div><div>Here, it is not the=
 colon the problem, but the arbitrary expression on the left of the colon.<=
/div><div>Supporting only arbitrary identifier tokens on the left of the co=
lon simplifies very much the wording of the feature: the rules are easy.<br=
></div><div>=C2=A0</div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/1901542c-d377-409a-9a53-b4c6a91638ea%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/1901542c-d377-409a-9a53-b4c6a91638ea=
%40isocpp.org</a>.<br />

------=_Part_408_1518795344.1533240730226--

------=_Part_407_219985627.1533240730224--

.


Author: mihailnajdenov@gmail.com
Date: Wed, 8 Aug 2018 06:13:57 -0700 (PDT)
Raw View
------=_Part_2352_1538675800.1533734037330
Content-Type: multipart/alternative;
 boundary="----=_Part_2353_984946850.1533734037332"

------=_Part_2353_984946850.1533734037332
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable



On Thursday, August 2, 2018 at 11:12:10 PM UTC+3, floria...@gmail.com wrote=
:
>
>
>
> Le jeudi 2 ao=C3=BBt 2018 18:50:03 UTC+2, mihailn...@gmail.com a =C3=A9cr=
it :
>>
>>
>>
>> On Thursday, August 2, 2018 at 6:58:01 PM UTC+3, floria...@gmail.com=20
>> wrote:
>>>
>>>
>>>
>>> Le jeudi 2 ao=C3=BBt 2018 17:23:06 UTC+2, mihailn...@gmail.com a =C3=A9=
crit :
>>>>
>>>> *Quote=20
>>>> from https://groups.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7N=
rwnGQ/czTCvTkSDQAJ=20
>>>> <https://groups.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnG=
Q/czTCvTkSDQAJ>*
>>>> =20
>>>>
>>>>> I was thinking about this one:=20
>>>>> https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6=
rLutWGp4I=20
>>>>>
>>>>> So let me tell you what I was thinking:
>>>>>
>>>>> There exist a common, yet unutterable, where tag types live (lets cal=
l=20
>>>>> it tag_ns to simplify).
>>>>>
>>>>> When you declare a function with tags:
>>>>> int foo(tag_name: float f);
>>>>> The compiler creates a tag type in this namespace called tag_name, an=
d=20
>>>>> transform the declaration like that:
>>>>> int foo(tag_ns::tag_name, float f);
>>>>>
>>>>> When you call a function with a tag:
>>>>> foo(tag_name: 1.f);
>>>>> The compiler creates a tag type in this namespace called tag_name,=20
>>>>> replaces the expression with a call like that (without even needing t=
o know=20
>>>>> the declaration of the function):
>>>>> foo(tag_ns::tag_name{}, 1.f);
>>>>>
>>>>> If two functions (even in different namespaces) use the same tag name=
,=20
>>>>> they will have the same tag type, which is fine.
>>>>>
>>>>
>>>> Yes, initially I was thinking names are names no matter the namespace,=
=20
>>>> but I abandoned this.
>>>>
>>>> I abandoned it because tags are types, and are used for overload=20
>>>> resolution. If the std has a tag named 'par' and I want to use this na=
me=20
>>>> but with different implementation, I must be able to do that, much lik=
e=20
>>>> today
>>>> We need namespaces for tags, and,  to the very least labels should be=
=20
>>>> defined in the namespace of the functions.
>>>>
>>>
>>> =20
>>
>>> The tag has no implementation, only the overload using the tag has an=
=20
>>> implementation. So there is absolutely no problem here.
>>> void foo(tag:);
>>> void bar(tag:);
>>>
>>> Why tag in both cases couldn't be the same? We use nothing from those=
=20
>>> tag objects.
>>>
>>
>> =20

> Tags are used for specialization of functions (parallel library is an=20
>> example). I must be able to declare tags that are named the same as the =
std=20
>> ones, yet are different type and will pick my overload, not the std one.=
=20
>>
>
> I don't think it is necessary to be useful.
>


You are right, still I don't want tags to have any uses that labels can't=
=20
cover. Otherwise we invent yet another feature, adding up to the language.=
=20
If we can eliminate an idiom with a feature it will be a win.
=20
=20

> =20
>
>>
>> If we completely remove namespaces for tags people will be forced to go=
=20
>> the C-way of naming to be able to create new type under the "same name" =
-=20
>> cuda_parallel - to force new overload.
>>
>
> What do you gain with:
> foo(cuda::parallel: ...);
> over:
> foo(cuda::parallel, ...);
> ?
>
> If it is only to be able to put a colon here, then it is not worth the=20
> effort.
> Also, I really don't like the three colons.=20
>


If foo is not in cuda, and if foo is declared to take the tag as template=
=20
argument (not overloading some other foo with a concrete label)=20
Then you gain nothing on the call site, compared to current state of=20
affairs.=20

Yet, *you don't lose either*. If we have to to std::tag<"cuda_parallel"> we=
=20
go backwards.=20

=20

> =20
>
>> =20
>>
>>>
>>> How many real world code use non-empty classes as tags?=20
>>>
>> =20
>>>
>>>>
>>>> But then I also abended automatic introduction...
>>>>
>>> =20
>>>>
>>>>> ...
>>>>>
>>>>> The main feature here would be the automatic introduction of types. A=
=20
>>>>> bit like a template instantiation. It is implicit.
>>>>>
>>>>
>>>> Automatic introduction is not that good of a barging - we invent new=
=20
>>>> rules to save some typing, but new problems arise.=20
>>>>
>>>
>>> What are those problems ?
>>> If tag: refers to a single type wherever you are (even across TUs), the=
n=20
>>> what is the problem?
>>> =20
>>>
>>>>
>>>> Where are tags created? How can we make them template? How can we add=
=20
>>>> attributes to them? Is this really new signature?
>>>>
>>>
>>> First, I was thinking in an unutterable namespace, yet common to all TU=
s.
>>> But then, making them an instantiation of std::tag<"tag_name"> might be=
=20
>>> better.
>>>
>>> You don't add attributes to them because you don't need to. Do you add=
=20
>>> attributes to the definition of std::string?
>>> =20
>>>
>>>>
>>>> *Sidenote*, how do you name the type to create a function signature?=
=20
>>>> decltype(name:)? name: to mean different things in different contexts?=
=20
>>>> Things escalate quickly.=20
>>>>
>>>
>>> =20
>>
>>> When you declare a function, you would do:
>>> void foo(tag_name:);
>>> // or
>>> // void foo(std::tag<"tag_name">);
>>>
>>> That's true name: would have different meaning depending on the=20
>>> context, but that's would be the case anyway because of labels.
>>>
>>
>> And what about std::function and pointers to functions? We will need to=
=20
>> touch a lot of places to enable this syntax. =20
>>
>
> =20

> If by "a lot", you mean 3, I agree:
> - parameter list of a function declarator
> - call expression
> - decltype expression (not even necessary)
>
> int main() {
>   // Parameter list of a function declarator
>   int foo(name: int); // -> int foo(std::tag<"name">, int);
>   std::function<int(name: int)> f =3D foo; // ->=20
> std::function<int(std::tag<"name">, int)> f =3D foo;
>   int (*g)(name: int) =3D static_cast<int(*)(name: int)>(&foo); // -> int=
=20
> (*g)(std::tag<"name">, int) =3D static_cast<int(*)(std::tag<"name">,=20
> int)>(&foo);
>   using foo_t =3D int(name: int); // -> int(std::tag<"name">, int)
>
>   // call expression
>   foo(name: 1); // -> foo(std::tag<"name">{}, 1);
>
>   // decltype expression
>   decltype(name:) h; // -> std::tag<"name"> h;
> }
>
> This is the beauty of this: by modifying slightly the language at 3=20
> places, it works nicely. There is no complicated rules.
> If name: appears in a parameter list of a function declarator, replace it=
=20
> with std::tag<"name">,
> If name: appears in a call expression, replace it with std::tag<"name">{}=
,
> if decltype(name:), replace the whole decltype expression with=20
> std::tag<"name">
>

The problem is, there is no rule the language can follow - we need to=20
hardcode all places to parse as either a type or value. On the contrary the=
 case=20
name is just another syntax for namespace resolution and the result is=20
always a type that can be used in *any* place type is required.=20

Also, I don't think being able to see the label is just a type (in a case=
=20
scope) is a bad thing.=20
I don't hold strong opinion as it is learnable either way and as I said am=
=20
not against that syntax, but just as shortcut.=20

having case struct name; introduced, a std::function<int(name: int)> could=
=20
be a shortcut for std::function<int(case name, int)>

=20

>
>
> You also need to define the class template std::tag, but that will be=20
> trivial.
>
>
>> Also note that we will need extra rules what introduces and what just=20
>> names a label. And these are not trivial, we can't always blindly=20
>> introduce.=20
>>
> Makes no sense to introduce a type by declaring a function pointer, even=
=20
>> if we agree to not have namespaces for them.
>>
>
> If you need a tag, you need a tag even when declaring a function pointer.
> And yes, we can blindly introduce tag types. How is it different from=20
> template instatiation?
>

We are yet to see how tag<"name"> will work in real life, considering it=20
injects a variable. Things are much more simpler if we can name an existing=
=20
type.=20

=20

>
> =20
>
>>
>> =20
>>
>>> And actually, when declaring a function and when using it, they don't=
=20
>>> mean the same language construct, but still have a common meaning: they=
 are=20
>>> tags.
>>> So only the translation would be different, not the meaning.
>>>
>>> Actually, with decltype(name:), whatever the translation of name: would=
=20
>>> be (type or object of that type), the result is still the same.
>>>
>>> =20
>>>
>>>>
>>>> In the end, I made it all as conservative as possible and as much base=
d=20
>>>> on current practice as possible. The initial simplicity was deceiving,=
=20
>>>> because it was just a morning idea.
>>>>
>>>
>>> On the contrary, the initial simplicity was great. I think you shouldn'=
t=20
>>> have tried to solve its issues by making more complex, but on the contr=
ary=20
>>> making it more simple (like I did).
>>>
>>
>>
>> It is more simple, in the sense, it maps 100% on to established practice=
=20
>> and 95+% on current types, declarations, scope, etc, rules=20
>>
>
> What you say is not simpler, it is more complete.
> When I say simpler, I mean the rules are simpler (a smaller wording).
> I never said that my proposition covers as much as yours.
> =20
>
>>
>> =20
>>
>>> =20
>>>
>>>>
>>>> This is not to say we could not use some shortcut syntax.
>>>>
>>>> We could
>>>>
>>>> int foo(tag_name: float f);
>>>>
>>>> generate
>>>>
>>>> case struct tag_name; //< enclosing scope
>>>> int foo(case tag_name, float f);
>>>>
>>>> But I still question the pros/cons ratio.=20
>>>>
>>>>
>>>>
>>>>
>>>>> In your first proposal, you mentioned you wanted to be able to do=20
>>>>> something like that:
>>>>> any(in_place<string>: "");
>>>>> I don't think it is useful. you are not naming an argument here.
>>>>>
>>>>
>>>> In *most* cases tags are used it is not as if the argument is named.=
=20
>>>>
>>>
>>> =20
>>
>>> True, tags are not names.
>>> Avoiding this use case makes the design very simple.
>>> Much simpler than all the alternatives you tried.
>>>
>>
>> Why should I avoid this case, I don't understand? The colon is perfectly=
=20
>> deducible in different contexts to mean slightly different things, but i=
t=20
>> *always *stands for a clarification.=20
>>
>
> =20

> Here, it is not the colon the problem, but the arbitrary expression on th=
e=20
> left of the colon.
> Supporting only arbitrary identifier tokens on the left of the colon=20
> simplifies very much the wording of the feature: the rules are easy.
>

I see, well as I said, I wanted 100% tags coverage, besides I *really* like=
=20
how in_place<string>: reads, but I guess it's subjective.


All in all I am not against what you are saying, for obvious reasons, but I=
=20
am skeptical if we introduce enough value.=20
Tags to be templates is a real-word need, tags to be in a namespaces=20
(sometimes different then the function) is real-word need.

These can't be done by automatic introduction, not without yet even more=20
sugar magic. =20

But I might be wrong, these could be left for tags, may be the original=20
idea names-are-names-period is the way to go. It is really, really hard to=
=20
estimate the usefulness of the feature if it is not "better tags" - will it=
=20
replace static functions for constructors? Will this be enough? Will there=
=20
be an upgrade path if someone decides the missing features should be added?


=20

> =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.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/0c551714-ba3c-4590-bab2-a059be4f3f2f%40isocpp.or=
g.

------=_Part_2353_984946850.1533734037332
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Thursday, August 2, 2018 at 11:12:10 PM UTC+3, =
floria...@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin=
: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div=
 dir=3D"ltr"><br><br>Le jeudi 2 ao=C3=BBt 2018 18:50:03 UTC+2, <a>mihailn..=
..@gmail.com</a> a =C3=A9crit=C2=A0:<blockquote class=3D"gmail_quote" style=
=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"=
><div dir=3D"ltr"><br><br>On Thursday, August 2, 2018 at 6:58:01 PM UTC+3, =
<a>floria...@gmail.com</a> wrote:<blockquote class=3D"gmail_quote" style=3D=
"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><d=
iv dir=3D"ltr"><br><br>Le jeudi 2 ao=C3=BBt 2018 17:23:06 UTC+2, <a>mihailn=
....@gmail.com</a> a =C3=A9crit=C2=A0:<blockquote class=3D"gmail_quote" styl=
e=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex=
"><div dir=3D"ltr"><div><b>Quote from=C2=A0<a onmousedown=3D"this.href=3D&#=
39;https://groups.google.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/c=
zTCvTkSDQAJ&#39;;return true;" onclick=3D"this.href=3D&#39;https://groups.g=
oogle.com/a/isocpp.org/d/msg/std-proposals/wz0a7NrwnGQ/czTCvTkSDQAJ&#39;;re=
turn true;" href=3D"https://groups.google.com/a/isocpp.org/d/msg/std-propos=
als/wz0a7NrwnGQ/czTCvTkSDQAJ" target=3D"_blank" rel=3D"nofollow">https://gr=
oups.google.<wbr>com/a/isocpp.org/d/msg/std-<wbr>proposals/wz0a7NrwnGQ/<wbr=
>czTCvTkSDQAJ</a></b></div><div>=C2=A0</div><blockquote class=3D"gmail_quot=
e" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb=
(204,204,204);border-left-width:1px;border-left-style:solid"><div>I was thi=
nking about this one: <a style=3D"border-bottom-color:rgb(17,85,204);border=
-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(17,85,204)=
;border-left-style:none;border-left-width:0px;border-right-color:rgb(17,85,=
204);border-right-style:none;border-right-width:0px;border-top-color:rgb(17=
,85,204);border-top-style:none;border-top-width:0px;color:rgb(17,85,204);ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bot=
tom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-decoration:=
none" onmousedown=3D"this.href=3D&#39;https://groups.google.com/a/isocpp.or=
g/forum/#!topic/std-proposals/O6rLutWGp4I&#39;;return true;" onclick=3D"thi=
s.href=3D&#39;https://groups.google.com/a/isocpp.org/forum/#!topic/std-prop=
osals/O6rLutWGp4I&#39;;return true;" href=3D"https://groups.google.com/a/is=
ocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I" target=3D"_blank" rel=3D"=
nofollow">https://groups.google.com/a/<wbr>isocpp.org/forum/#!topic/std-<wb=
r>proposals/O6rLutWGp4I</a> <br style=3D"border-bottom-color:rgb(34,34,34);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,3=
4,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(3=
4,34,34);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34);=
line-height:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margi=
n-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top=
:0px"></div><div><br style=3D"border-bottom-color:rgb(34,34,34);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);borde=
r-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34)=
;border-top-style:none;border-top-width:0px;color:rgb(34,34,34);line-height=
:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;p=
adding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></div=
><div>So let me tell you what I was thinking:</div><div><br style=3D"border=
-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0p=
x;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:=
0px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-w=
idth:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-wi=
dth:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;margin-lef=
t:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;p=
adding-right:0px;padding-top:0px"></div><div>There exist a common, yet unut=
terable, where tag types live (lets call it tag_ns to simplify).</div><div>=
<br style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none=
;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:=
none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style=
:none;border-top-width:0px;color:rgb(34,34,34);line-height:normal;margin-bo=
ttom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px=
;padding-left:0px;padding-right:0px;padding-top:0px"></div><div>When you de=
clare a function with tags:</div><div><div style=3D"background-color:rgb(25=
0,250,250);border-bottom-color:rgb(187,187,187);border-bottom-style:solid;b=
order-bottom-width:1px;border-left-color:rgb(187,187,187);border-left-style=
:solid;border-left-width:1px;border-right-color:rgb(187,187,187);border-rig=
ht-style:solid;border-right-width:1px;border-top-color:rgb(187,187,187);bor=
der-top-style:solid;border-top-width:1px;margin-bottom:0px;margin-left:0px;=
margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding=
-right:0px;padding-top:0px"><code style=3D"border-bottom-color:rgb(34,34,34=
);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34=
,34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb=
(34,34,34);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;=
margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-=
left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bottom-col=
or:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-le=
ft-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;bo=
rder-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px"><span style=3D"b=
order-bottom-color:rgb(0,0,136);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(0,0,136);border-left-style:none;border-left-wid=
th:0px;border-right-color:rgb(0,0,136);border-right-style:none;border-right=
-width:0px;border-top-color:rgb(0,0,136);border-top-style:none;border-top-w=
idth:0px;color:rgb(0,0,136);margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px">int</span><span style=3D"border-bottom-color:rgb(0,0,0);bord=
er-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);b=
order-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);b=
order-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0p=
x;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddin=
g-left:0px;padding-right:0px;padding-top:0px"> foo</span><span style=3D"bor=
der-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(102,102,0);border-left-style:none;border-left-w=
idth:0px;border-right-color:rgb(102,102,0);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(102,102,0);border-top-style:none;border=
-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margi=
n-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-righ=
t:0px;padding-top:0px">(</span><span style=3D"border-bottom-color:rgb(0,0,0=
);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,=
0,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(0,=
0,0);border-right-style:none;border-right-width:0px;border-top-color:rgb(0,=
0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bot=
tom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px">tag_name</span><span st=
yle=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:n=
one;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px">:</span><span style=3D"border-bottom-color=
:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-co=
lor:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-co=
lor:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-co=
lor:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"> </span><span=
 style=3D"border-bottom-color:rgb(0,0,136);border-bottom-style:none;border-=
bottom-width:0px;border-left-color:rgb(0,0,136);border-left-style:none;bord=
er-left-width:0px;border-right-color:rgb(0,0,136);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,136);border-top-style:none;b=
order-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px">float</span><span style=3D"border-bottom-color:rg=
b(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-color=
:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px"> f</span><span s=
tyle=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-=
bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:no=
ne;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:=
none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-lef=
t:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;p=
adding-right:0px;padding-top:0px">);</span><span style=3D"border-bottom-col=
or:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-=
color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-=
color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-=
color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0=
);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span>=
</div></code></div>The compiler creates a tag type in this namespace called=
 tag_name, and transform the declaration like that:</div><div><div style=3D=
"background-color:rgb(250,250,250);border-bottom-color:rgb(187,187,187);bor=
der-bottom-style:solid;border-bottom-width:1px;border-left-color:rgb(187,18=
7,187);border-left-style:solid;border-left-width:1px;border-right-color:rgb=
(187,187,187);border-right-style:solid;border-right-width:1px;border-top-co=
lor:rgb(187,187,187);border-top-style:solid;border-top-width:1px;margin-bot=
tom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px"><code style=3D"border-b=
ottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div st=
yle=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;borde=
r-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;=
border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px"><span style=3D"border-bottom-color:rgb(0,0,136);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(0,0,136);border-left-st=
yle:none;border-left-width:0px;border-right-color:rgb(0,0,136);border-right=
-style:none;border-right-width:0px;border-top-color:rgb(0,0,136);border-top=
-style:none;border-top-width:0px;color:rgb(0,0,136);margin-bottom:0px;margi=
n-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:=
0px;padding-right:0px;padding-top:0px">int</span><span style=3D"border-bott=
om-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border=
-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;borde=
r-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb=
(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;p=
adding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"> foo<=
/span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-=
style:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);bord=
er-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px">(</span><span style=3D"borde=
r-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px=
;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;col=
or:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top=
:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"=
>tag_ns</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);bord=
er-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(102,102=
,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px">::</span><span style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;m=
argin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding=
-top:0px">tag_name</span><span style=3D"border-bottom-color:rgb(102,102,0);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,=
102,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
102,102,0);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102=
,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">,</span><=
span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;borde=
r-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bord=
er-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bor=
der-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;borde=
r-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px"> </span><span style=3D"border-bottom-color:rgb(0,0,136)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0=
,136);border-left-style:none;border-left-width:0px;border-right-color:rgb(0=
,0,136);border-right-style:none;border-right-width:0px;border-top-color:rgb=
(0,0,136);border-top-style:none;border-top-width:0px;color:rgb(0,0,136);mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px">float</span><spa=
n style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-=
left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border=
-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-t=
op-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px"> f</span><span style=3D"border-bottom-color:rgb(102,102,0)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102=
,102,0);border-left-style:none;border-left-width:0px;border-right-color:rgb=
(102,102,0);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,10=
2,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">);</span=
><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bor=
der-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border=
-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border=
-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border=
-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;marg=
in-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-rig=
ht:0px;padding-top:0px"></span></div></code></div></div><div><br style=3D"b=
order-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-wid=
th:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-w=
idth:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-t=
op-width:0px;color:rgb(34,34,34);line-height:normal;margin-bottom:0px;margi=
n-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:=
0px;padding-right:0px;padding-top:0px"></div><div>When you call a function =
with a tag:</div><div><div style=3D"background-color:rgb(250,250,250);borde=
r-bottom-color:rgb(187,187,187);border-bottom-style:solid;border-bottom-wid=
th:1px;border-left-color:rgb(187,187,187);border-left-style:solid;border-le=
ft-width:1px;border-right-color:rgb(187,187,187);border-right-style:solid;b=
order-right-width:1px;border-top-color:rgb(187,187,187);border-top-style:so=
lid;border-top-width:1px;margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px"><code style=3D"border-bottom-color:rgb(34,34,34);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-l=
eft-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bo=
rder-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;=
margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding=
-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,=
34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
34,34,34);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-l=
eft:0px;padding-right:0px;padding-top:0px"><span style=3D"border-bottom-col=
or:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-=
color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-=
color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-=
color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0=
);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">foo</span><=
span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;b=
order-bottom-width:0px;border-left-color:rgb(102,102,0);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(102,102,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(102,102,0);border-top-=
style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;marg=
in-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left=
:0px;padding-right:0px;padding-top:0px">(</span><span style=3D"border-botto=
m-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(=
0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">tag_na=
me</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-le=
ft-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);b=
order-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px">:</span><span style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px"> </span><span style=3D"border-bottom-color:rgb(0,102,102);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(0,102,102);border=
-left-style:none;border-left-width:0px;border-right-color:rgb(0,102,102);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(0,102,102=
);border-top-style:none;border-top-width:0px;color:rgb(0,102,102);margin-bo=
ttom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px=
;padding-left:0px;padding-right:0px;padding-top:0px">1.f</span><span style=
=3D"border-bottom-color:rgb(102,102,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(102,102,0);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(102,102,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(102,102,0);border-top-style:none=
;border-top-width:0px;color:rgb(102,102,0);margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px">);</span><span style=3D"border-bottom-color:r=
gb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-colo=
r:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-colo=
r:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bot=
tom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span></div>=
</code></div></div><div>The
 compiler creates a tag type in this namespace called tag_name, replaces
 the expression with a call like that (without even needing to know the=20
declaration of the function):</div><div><div style=3D"background-color:rgb(=
250,250,250);border-bottom-color:rgb(187,187,187);border-bottom-style:solid=
;border-bottom-width:1px;border-left-color:rgb(187,187,187);border-left-sty=
le:solid;border-left-width:1px;border-right-color:rgb(187,187,187);border-r=
ight-style:solid;border-right-width:1px;border-top-color:rgb(187,187,187);b=
order-top-style:solid;border-top-width:1px;margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px"><code style=3D"border-bottom-color:rgb(34,34,=
34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(=
34,34,34);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(34,34,34);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0p=
x;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddin=
g-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bottom-c=
olor:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><span style=3D=
"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width=
:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0=
px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">foo</span><span style=3D"border-bottom-color:rgb(102,102,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,=
0);border-right-style:none;border-right-width:0px;border-top-color:rgb(102,=
102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px">(</span><span sty=
le=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom=
-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-=
width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-righ=
t-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-wi=
dth:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px">tag_ns</span><span style=3D"border-bottom-color:rgb(102,102,0);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,=
102,0);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
102,102,0);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102=
,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">::</span>=
<span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bord=
er-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-=
right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:=
0px;padding-top:0px">tag_name</span><span style=3D"border-bottom-color:rgb(=
102,102,0);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(102,102,0);border-left-style:none;border-left-width:0px;border-right=
-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:=
rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
">{},</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-st=
yle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-s=
tyle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-sty=
le:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px"> </span><span style=3D"border-bottom-color=
:rgb(0,102,102);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(0,102,102);border-left-style:none;border-left-width:0px;border-=
right-color:rgb(0,102,102);border-right-style:none;border-right-width:0px;b=
order-top-color:rgb(0,102,102);border-top-style:none;border-top-width:0px;c=
olor:rgb(0,102,102);margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">1.f</span><span style=3D"border-bottom-color:rgb(102,102,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(102,102,=
0);border-right-style:none;border-right-width:0px;border-top-color:rgb(102,=
102,0);border-top-style:none;border-top-width:0px;color:rgb(102,102,0);marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px">);</span><span st=
yle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left=
-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-rig=
ht-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-w=
idth:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-styl=
e:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px"></span></div></code></div><br style=3D"border-bottom-color:r=
gb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:r=
gb(34,34,34);line-height:normal;margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px">If two functions (even in different namespaces) use the =
same tag name, they will have the same tag type, which is fine.</div></bloc=
kquote><div><br></div><div>Yes, initially I was thinking names are names no=
 matter the namespace, but I <span style=3D"display:inline!important;float:=
none;background-color:transparent;color:rgb(34,34,34);font-family:&quot;Ari=
al&quot;,&quot;Helvetica&quot;,sans-serif;font-size:13px;font-style:normal;=
font-variant:normal;font-weight:400;letter-spacing:normal;text-align:left;t=
ext-decoration:none;text-indent:0px;text-transform:none;white-space:normal;=
word-spacing:0px">abandoned </span>this.</div><div><br></div><div>I abandon=
ed it because tags are types, and are used for overload resolution. If the =
std has a tag named &#39;par&#39; and I want to use this name but with diff=
erent implementation, I must be able to do that, much like today</div><div>=
We need namespaces for tags, and,=C2=A0 to the very least labels should be =
defined in the namespace of the functions.</div></div></blockquote><div><br=
></div></div></blockquote><div>=C2=A0</div><blockquote class=3D"gmail_quote=
" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-le=
ft:1ex"><div dir=3D"ltr"><div></div><div>The tag has no implementation, onl=
y the overload using the tag has an implementation. So there is absolutely =
no problem here.</div><div><div style=3D"background-color:rgb(250,250,250);=
border-color:rgb(187,187,187);border-style:solid;border-width:1px"><code><d=
iv><span style=3D"color:#008">void</span><span style=3D"color:#000"> foo</s=
pan><span style=3D"color:#660">(</span><span style=3D"color:#000">tag</span=
><span style=3D"color:#660">:);</span><span style=3D"color:#000"><br></span=
><span style=3D"color:#008">void</span><span style=3D"color:#000"> bar</spa=
n><span style=3D"color:#660">(</span><span style=3D"color:#000">tag</span><=
span style=3D"color:#660">:);</span><span style=3D"color:#000"><br></span><=
/div></code></div></div><div><br></div><div>Why tag in both cases couldn&#3=
9;t be the same? We use nothing from those tag objects.</div></div></blockq=
uote><div><br></div></div></blockquote></div></blockquote><div>=C2=A0</div>=
<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bor=
der-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #c=
cc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>Tags are used f=
or specialization of functions (parallel library is an example). I must be =
able to declare tags that are named the same as the std ones, yet are diffe=
rent type and will pick my overload, not the std one.=C2=A0</div></div></bl=
ockquote><div><br></div><div>I don&#39;t think it is necessary to be useful=
..<br></div></div></blockquote><div><br></div><div><br></div><div>You are ri=
ght, still I don&#39;t want tags to have any uses that labels can&#39;t cov=
er. Otherwise we invent yet another feature, adding up to the language. If =
we can eliminate an idiom with a feature it will be a win.</div><div>=C2=A0=
</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0=
;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div di=
r=3D"ltr"><div></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1e=
x"><div dir=3D"ltr"><div><br></div><div>If we completely remove namespaces =
for tags people will be forced to go the C-way of naming to be able to crea=
te new type under the &quot;same name&quot; - cuda_parallel - to force new =
overload.</div></div></blockquote><div><br></div><div>What do you gain with=
:</div><div><div style=3D"background-color:rgb(250,250,250);border-color:rg=
b(187,187,187);border-style:solid;border-width:1px"><code><div><span style=
=3D"color:#000">foo</span><span style=3D"color:#660">(</span><span style=3D=
"color:#000">cuda</span><span style=3D"color:#660">::</span><span style=3D"=
color:#000">parallel</span><span style=3D"color:#660">:</span><span style=
=3D"color:#000"> </span><span style=3D"color:#660">...);</span><span style=
=3D"color:#000"><br></span></div></code></div>over:</div><div><div style=3D=
"background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-sty=
le:solid;border-width:1px"><code><div><span style=3D"color:#000">foo</span>=
<span style=3D"color:#660">(</span><span style=3D"color:#000">cuda</span><s=
pan style=3D"color:#660">::</span><span style=3D"color:#000">parallel</span=
><span style=3D"color:#660">,</span><span style=3D"color:#000"> </span><spa=
n style=3D"color:#660">...);</span><span style=3D"color:#000"><br></span></=
div></code></div></div><div>?<br></div><div><br></div><div>If it is only to=
 be able to put a colon here, then it is not worth the effort.<br>Also, I r=
eally don&#39;t like the three colons.=C2=A0</div></div></blockquote><div><=
br></div><div><br></div><div>If foo is not in cuda, and if foo is declared =
to take the tag as template argument (not overloading some other foo with a=
 concrete label)=C2=A0</div><div>Then you gain nothing on the call site, co=
mpared to current state of affairs.=C2=A0</div><div><br></div><div>Yet, <i>=
you don&#39;t lose either</i>. If we have to to <font face=3D"courier new,m=
onospace">std::tag&lt;&quot;cuda_parallel&quot;&gt;</font> we go backwards.=
=C2=A0</div><div><br></div><div>=C2=A0</div><blockquote class=3D"gmail_quot=
e" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;paddin=
g-left: 1ex;"><div dir=3D"ltr"><div></div><div>=C2=A0</div><blockquote clas=
s=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div dir=3D"ltr"><div>=C2=A0</div><blockquote class=
=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc s=
olid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>How many real w=
orld code use non-empty classes as tags?=C2=A0</div></div></blockquote><blo=
ckquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-le=
ft:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>=C2=A0=
</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex=
;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></d=
iv><div>But then I also abended automatic introduction...<br></div></div></=
blockquote><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:=
0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></=
div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0px =
0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-le=
ft-width:1px;border-left-style:solid"><div>...</div><div><div style=3D"bord=
er-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:=
0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-widt=
h:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-right=
-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-=
width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br=
 style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:no=
ne;border-top-width:0px;color:rgb(34,34,34);line-height:normal;margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px"></div><div style=3D"borde=
r-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width=
:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-w=
idth:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;=
padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">The =
main feature here would be the automatic introduction of types. A bit like =
a template instantiation. It is implicit.<br style=3D"border-bottom-color:r=
gb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:r=
gb(34,34,34);line-height:normal;margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px"></div></div></blockquote><div><br></div><div>Automatic i=
ntroduction is not that good of a barging - we invent new rules to save som=
e typing, but new problems arise.=C2=A0</div></div></blockquote><div><br></=
div><div>What are those problems ?</div><div>If tag: refers to a single typ=
e wherever you are (even across TUs), then what is the problem?<br></div><d=
iv>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-l=
eft:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><di=
v><br></div><div>Where are tags created? How can we make them template? How=
 can we add attributes to them? Is this really new signature?</div></div></=
blockquote><div><br></div><div>First, I was thinking in an unutterable name=
space, yet common to all TUs.</div><div>But then, making them an instantiat=
ion of std::tag&lt;&quot;tag_name&quot;&gt; might be better.<br></div><div>=
<br></div><div>You don&#39;t add attributes to them because you don&#39;t n=
eed to. Do you add attributes to the definition of std::string?<br></div><d=
iv>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-l=
eft:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><di=
v><br></div><div><b>Sidenote</b>, how do you name the type to create a func=
tion signature?<font face=3D"courier new,monospace"> decltype(name:)</font>=
? <font face=3D"courier new,monospace">name:</font> to mean different thing=
s in different contexts? Things escalate quickly.=C2=A0</div></div></blockq=
uote><div><br></div></div></blockquote><div>=C2=A0</div><blockquote class=
=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc s=
olid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>When you declare a =
function, you would do:</div><div><div style=3D"background-color:rgb(250,25=
0,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px"><=
code><div><span style=3D"color:#008">void</span><span style=3D"color:#000">=
 foo</span><span style=3D"color:#660">(</span><span style=3D"color:#000">ta=
g_name</span><span style=3D"color:#660">:);</span><span style=3D"color:#000=
"><br></span><span style=3D"color:#800">// or</span><span style=3D"color:#0=
00"><br></span><span style=3D"color:#800">// void foo(std::tag&lt;&quot;tag=
_name&quot;&gt;);</span><span style=3D"color:#000"><br></span></div></code>=
</div><br></div><div>That&#39;s true <span style=3D"font-family:courier new=
,monospace">name:</span> would have different meaning depending on the cont=
ext, but that&#39;s would be the case anyway because of labels.</div></div>=
</blockquote><div><br></div><div>And what about std::function and pointers =
to functions? We will need to touch a lot of places to enable this syntax. =
=C2=A0</div></div></blockquote><div><br></div></div></blockquote><div>=C2=
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: =
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div=
></div><div>If by &quot;a lot&quot;, you mean 3, I agree:</div><div>- param=
eter list of a function declarator<br><div>- call expression</div><div>- de=
cltype expression (not even necessary)<br></div></div><div><br></div><div><=
div style=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187=
);border-style:solid;border-width:1px"><code><div><span style=3D"color:#008=
">int</span><span style=3D"color:#000"> main</span><span style=3D"color:#66=
0">()</span><span style=3D"color:#000"> </span><span style=3D"color:#660">{=
</span><span style=3D"color:#000"><br>=C2=A0 </span><span style=3D"color:#8=
00">// Parameter list of a function declarator</span><span style=3D"color:#=
000"><br>=C2=A0 </span><span style=3D"color:#008">int</span><span style=3D"=
color:#000"> foo</span><span style=3D"color:#660">(</span><span style=3D"co=
lor:#000">name</span><span style=3D"color:#660">:</span><span style=3D"colo=
r:#000"> </span><span style=3D"color:#008">int</span><span style=3D"color:#=
660">);</span><span style=3D"color:#000"> </span><span style=3D"color:#800"=
>// -&gt; int foo(std::tag&lt;&quot;name&quot;&gt;, int);</span><span style=
=3D"color:#000"><br>=C2=A0 std</span><span style=3D"color:#660">::</span><s=
pan style=3D"color:#008">function</span><span style=3D"color:#660">&lt;</sp=
an><span style=3D"color:#008">int</span><span style=3D"color:#660">(</span>=
<span style=3D"color:#000">name</span><span style=3D"color:#660">:</span><s=
pan style=3D"color:#000"> </span><span style=3D"color:#008">int</span><span=
 style=3D"color:#660">)&gt;</span><span style=3D"color:#000"> f </span><spa=
n style=3D"color:#660">=3D</span><span style=3D"color:#000"> foo</span><spa=
n style=3D"color:#660">;</span><span style=3D"color:#000"> </span><span sty=
le=3D"color:#800">// -&gt; std::function&lt;int(std::tag&lt;&quot;<wbr>name=
&quot;&gt;, int)&gt; f =3D foo;</span><span style=3D"color:#000"><br>=C2=A0=
 </span><span style=3D"color:#008">int</span><span style=3D"color:#000"> </=
span><span style=3D"color:#660">(*</span><span style=3D"color:#000">g</span=
><span style=3D"color:#660">)(</span><span style=3D"color:#000">name</span>=
<span style=3D"color:#660">:</span><span style=3D"color:#000"> </span><span=
 style=3D"color:#008">int</span><span style=3D"color:#660">)</span><span st=
yle=3D"color:#000"> </span><span style=3D"color:#660">=3D</span><span style=
=3D"color:#000"> </span><span style=3D"color:#008">static_cast</span><span =
style=3D"color:#660">&lt;</span><span style=3D"color:#008">int</span><span =
style=3D"color:#660">(*)(</span><span style=3D"color:#000">name</span><span=
 style=3D"color:#660">:</span><span style=3D"color:#000"> </span><span styl=
e=3D"color:#008">int</span><span style=3D"color:#660">)&gt;(&amp;</span><sp=
an style=3D"color:#000">foo</span><span style=3D"color:#660">);</span><span=
 style=3D"color:#000"> </span><span style=3D"color:#800">// -&gt; int (*g)(=
std::tag&lt;&quot;name&quot;&gt;, int) =3D static_cast&lt;int(*)(std::tag&l=
t;&quot;<wbr>name&quot;&gt;, int)&gt;(&amp;foo);</span><span style=3D"color=
:#000"><br>=C2=A0 </span><span style=3D"color:#008">using</span><span style=
=3D"color:#000"> foo_t </span><span style=3D"color:#660">=3D</span><span st=
yle=3D"color:#000"> </span><span style=3D"color:#008">int</span><span style=
=3D"color:#660">(</span><span style=3D"color:#000">name</span><span style=
=3D"color:#660">:</span><span style=3D"color:#000"> </span><span style=3D"c=
olor:#008">int</span><span style=3D"color:#660">);</span><span style=3D"col=
or:#000"> </span><span style=3D"color:#800">// -&gt; int(std::tag&lt;&quot;=
name&quot;&gt;, int)</span><span style=3D"color:#000"><br><br>=C2=A0 </span=
><span style=3D"color:#800">// call expression</span><span style=3D"color:#=
000"><br>=C2=A0 foo</span><span style=3D"color:#660">(</span><span style=3D=
"color:#000">name</span><span style=3D"color:#660">:</span><span style=3D"c=
olor:#000"> </span><span style=3D"color:#066">1</span><span style=3D"color:=
#660">);</span><span style=3D"color:#000"> </span><span style=3D"color:#800=
">// -&gt; foo(std::tag&lt;&quot;name&quot;&gt;{}, 1);</span><span style=3D=
"color:#000"><br><br>=C2=A0 </span><span style=3D"color:#800">// decltype e=
xpression</span><span style=3D"color:#000"><br>=C2=A0 </span><span style=3D=
"color:#008">decltype</span><span style=3D"color:#660">(</span><span style=
=3D"color:#000">name</span><span style=3D"color:#660">:)</span><span style=
=3D"color:#000"> h</span><span style=3D"color:#660">;</span><span style=3D"=
color:#000"> </span><span style=3D"color:#800">// -&gt; std::tag&lt;&quot;n=
ame&quot;&gt; h;</span><span style=3D"color:#000"><br></span><span style=3D=
"color:#660">}</span><span style=3D"color:#000"><br></span></div></code></d=
iv></div><div><br></div><div>This is the beauty of this: by modifying sligh=
tly the language at 3 places, it works nicely. There is no complicated rule=
s.</div><div>If <span style=3D"font-family:courier new,monospace">name:</sp=
an> appears in a parameter list of a function declarator, replace it with <=
span style=3D"font-family:courier new,monospace">std::tag&lt;&quot;name&quo=
t;&gt;,</span></div><div>If <span style=3D"font-family:courier new,monospac=
e">name:</span> appears in a call expression, replace it with <span style=
=3D"font-family:courier new,monospace">std::tag&lt;&quot;name&quot;&gt;{},<=
/span></div><div>if <span style=3D"font-family:courier new,monospace">declt=
ype(name:)</span>, replace the whole <span style=3D"font-family:courier new=
,monospace">decltype</span> expression with <span style=3D"font-family:cour=
ier new,monospace">std::tag&lt;&quot;name&quot;&gt;</span></div></div></blo=
ckquote><div><br></div><div>The problem is, there is no rule the language c=
an follow - we need to hardcode all places to parse as either a type or val=
ue. On the contrary the <font face=3D"courier new,monospace">case name</fon=
t> is just another syntax for namespace resolution and the result is always=
 a type that can be used in <i>any</i> place type is required.=C2=A0</div><=
div><br></div><div>Also, I don&#39;t think being able to see the label is j=
ust a type (in a <font face=3D"courier new,monospace">case</font> scope) is=
 a bad thing.=C2=A0</div><div>I don&#39;t hold strong opinion as it is lear=
nable either way and as I said am not against that syntax, but just as shor=
tcut.=C2=A0</div><div><br></div><div>having <font face=3D"courier new,monos=
pace">case struct name;</font> introduced, a=C2=A0<font face=3D"courier new=
,monospace">std::function&lt;int(name: int)&gt;=C2=A0</font>could be a shor=
tcut for<font face=3D"courier new,monospace">=C2=A0std::function&lt;int(cas=
e name, int)&gt;</font></div><div><b></b><i></i><u></u><sub></sub><sup></su=
p><strike></strike><font face=3D"courier new,monospace"></font><font face=
=3D"courier new,monospace"></font><b></b><i></i><u></u><sub></sub><sup></su=
p><strike></strike><br></div><div>=C2=A0</div><blockquote class=3D"gmail_qu=
ote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padd=
ing-left: 1ex;"><div dir=3D"ltr"><div><br></div><div><br></div><div>You als=
o need to define the class template <span style=3D"font-family:courier new,=
monospace">std::tag</span>, but that will be trivial.</div><div><br></div><=
blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border=
-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div=
>Also note that we will need extra rules what introduces and what just name=
s a label. And these are not trivial, we can&#39;t always blindly introduce=
..=C2=A0</div></div></blockquote><blockquote class=3D"gmail_quote" style=3D"=
margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><di=
v dir=3D"ltr"><div>Makes no sense to introduce a type by declaring a functi=
on pointer, even if we agree to not have namespaces for them.</div></div></=
blockquote><div><div><br></div>If you need a tag, you need a tag even when =
declaring a function pointer.</div><div>And yes, we can blindly introduce t=
ag types. How is it different from template instatiation?</div></div></bloc=
kquote><div><br></div><div>We are yet to see how <font face=3D"courier new,=
monospace">tag&lt;&quot;name&quot;&gt;</font> will work in real life, consi=
dering it injects a variable. Things are much more simpler if we can name a=
n existing type.=C2=A0</div><div><font face=3D"courier new,monospace"></fon=
t><br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"mar=
gin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><=
div dir=3D"ltr"><br><div>=C2=A0</div><blockquote class=3D"gmail_quote" styl=
e=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex=
"><div dir=3D"ltr"><div><br></div><div>=C2=A0</div><blockquote class=3D"gma=
il_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;pa=
dding-left:1ex"><div dir=3D"ltr"><div>And actually, when declaring a functi=
on and when using it, they don&#39;t mean the same language construct, but =
still have a common meaning: they are tags.</div><div>So only the translati=
on would be different, not the meaning.</div><div><br></div><div>Actually, =
with <span style=3D"font-family:courier new,monospace">decltype(name:)</spa=
n>, whatever the translation of <span style=3D"font-family:courier new,mono=
space">name:</span> would be (type or object of that type), the result is s=
till the same.<br></div><div><br></div><div>=C2=A0</div><blockquote class=
=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc s=
olid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>In the end, I m=
ade it all as conservative as possible and as much based on current practic=
e as possible. The initial simplicity was deceiving, because it was just a =
morning idea.</div></div></blockquote><div><br></div><div>On the contrary, =
the initial simplicity was great. I think you shouldn&#39;t have tried to s=
olve its issues by making more complex, but on the contrary making it more =
simple (like I did).<br></div></div></blockquote><div><br></div><div><br></=
div><div>It is more simple, in the sense, it maps 100% on to established pr=
actice and 95+% on current types, declarations, scope, etc, rules=C2=A0<br>=
</div></div></blockquote><div><br></div><div>What you say is not simpler, i=
t is more complete.<br></div><div>When I say simpler, I mean the rules are =
simpler (a smaller wording).</div><div>I never said that my proposition cov=
ers as much as yours.<br></div><div>=C2=A0</div><blockquote class=3D"gmail_=
quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;paddi=
ng-left:1ex"><div dir=3D"ltr"><div></div><div><br></div><div>=C2=A0</div><b=
lockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-=
left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>=C2=
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.=
8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br>=
</div><div>This is not to say we could not use some shortcut syntax.</div><=
div><br></div><div>We could</div><div><br></div><font face=3D"courier new,m=
onospace">int foo(tag_name: float f);</font><div><br></div><div>generate</d=
iv><div><br></div><div><span style=3D"text-align:left;color:rgb(34,34,34);t=
ext-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px;fon=
t-style:normal;font-variant:normal;font-weight:400;text-decoration:none;wor=
d-spacing:0px;display:inline!important;white-space:normal;float:none;backgr=
ound-color:transparent"><font face=3D"courier new,monospace">case struct ta=
g_name; //&lt; enclosing scope</font></span><b></b><i></i><u></u><sub></sub=
><sup></sup><strike></strike><br></div><div><font face=3D"courier new,monos=
pace">i<span style=3D"text-align:left;color:rgb(34,34,34);text-transform:no=
ne;text-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal;f=
ont-variant:normal;font-weight:400;text-decoration:none;word-spacing:0px;di=
splay:inline!important;white-space:normal;float:none;background-color:trans=
parent">nt foo(case tag_name, float f);</span></font></div><div><font face=
=3D"courier new,monospace"><span style=3D"text-align:left;color:rgb(34,34,3=
4);text-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px=
;font-style:normal;font-variant:normal;font-weight:400;text-decoration:none=
;word-spacing:0px;display:inline!important;white-space:normal;float:none;ba=
ckground-color:transparent"><br></span></font></div><div><span style=3D"tex=
t-align:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter=
-spacing:normal;font-size:13px;font-style:normal;font-variant:normal;font-w=
eight:400;text-decoration:none;word-spacing:0px;display:inline!important;wh=
ite-space:normal;float:none;background-color:transparent"><font face=3D"ari=
al,sans-serif">But I still question the pros/cons ratio.=C2=A0</font></span=
></div><div><font face=3D"courier new,monospace"></font><br></div><div><b><=
/b><i></i><u></u><sub></sub><sup></sup><strike></strike><font face=3D"couri=
er new,monospace"></font><br></div><div><br></div><blockquote class=3D"gmai=
l_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-col=
or:rgb(204,204,204);border-left-width:1px;border-left-style:solid"><div><di=
v style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;borde=
r-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;b=
order-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:no=
ne;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:n=
one;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px"></div><div style=3D"border-bottom-color:rgb(34,34,34);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);bor=
der-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,3=
4);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(34,34=
,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb=
(34,34,34);border-left-style:none;border-left-width:0px;border-right-color:=
rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-col=
or:rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34=
,34);line-height:normal;margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px"></div><div style=3D"border-bottom-color:rgb(34,34,34);border-bot=
tom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);bord=
er-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);b=
order-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34=
);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:=
0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pad=
ding-right:0px;padding-top:0px">In your first proposal, you mentioned you w=
anted to be able to do something like that:</div><div style=3D"border-botto=
m-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bord=
er-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;bo=
rder-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0=
px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0p=
x;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div style=
=3D"background-color:rgb(250,250,250);border-bottom-color:rgb(187,187,187);=
border-bottom-style:solid;border-bottom-width:1px;border-left-color:rgb(187=
,187,187);border-left-style:solid;border-left-width:1px;border-right-color:=
rgb(187,187,187);border-right-style:solid;border-right-width:1px;border-top=
-color:rgb(187,187,187);border-top-style:solid;border-top-width:1px;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px"><code style=3D"borde=
r-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width=
:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-w=
idth:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;=
padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div=
 style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:no=
ne;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px"><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-styl=
e:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:=
0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pad=
ding-right:0px;padding-top:0px">any</span><span style=3D"border-bottom-colo=
r:rgb(102,102,0);border-bottom-style:none;border-bottom-width:0px;border-le=
ft-color:rgb(102,102,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(102,102,0);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(102,102,0);border-top-style:none;border-top-width:0px;=
color:rgb(102,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px">(</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-rig=
ht-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top=
-style:none;border-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px">in_place</span><span style=3D"border-b=
ottom-color:rgb(0,136,0);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(0,136,0);border-left-style:none;border-left-width:0px;=
border-right-color:rgb(0,136,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,136,0);border-top-style:none;border-top-width:0p=
x;color:rgb(0,136,0);margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px">&lt;string&gt;</span><span style=3D"border-bottom-color:rgb(102,102=
,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(=
102,102,0);border-left-style:none;border-left-width:0px;border-right-color:=
rgb(102,102,0);border-right-style:none;border-right-width:0px;border-top-co=
lor:rgb(102,102,0);border-top-style:none;border-top-width:0px;color:rgb(102=
,102,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;p=
adding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">:</sp=
an><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;b=
order-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;=
border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none=
;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;b=
order-top-width:0px;color:rgb(0,0,0);margin-bottom:0px;margin-left:0px;marg=
in-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-rig=
ht:0px;padding-top:0px"> </span><span style=3D"border-bottom-color:rgb(0,13=
6,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb=
(0,136,0);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(0,136,0);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(0,136,0);border-top-style:none;border-top-width:0px;color:rgb(0,136,0)=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">&quot;&quot;=
</span><span style=3D"border-bottom-color:rgb(102,102,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(102,102,0);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(102,102,0);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(102,102,0);bor=
der-top-style:none;border-top-width:0px;color:rgb(102,102,0);margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px">);</span><span style=3D"bor=
der-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0p=
x;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px=
;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0=
px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;c=
olor:rgb(0,0,0);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-t=
op:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0p=
x"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px"></span></div></code></div>I don&#39;t think it is useful. you are not =
naming an argument here.</div></div></blockquote><div><br></div><div>In <i>=
most</i> cases tags are used it is not as if the argument is named.=C2=A0</=
div></div></blockquote><div><br></div></div></blockquote><div>=C2=A0</div><=
blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border=
-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>Tru=
e, tags are not names.</div><div>Avoiding this use case makes the design ve=
ry simple.</div><div>Much simpler than all the alternatives you tried.</div=
></div></blockquote><div><br></div><div>Why should I avoid this case, I don=
&#39;t understand? The colon is perfectly deducible in different contexts t=
o mean slightly different things, but it <i>always=C2=A0</i>stands for a cl=
arification. <br></div></div></blockquote><div><br></div></div></blockquote=
><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;marg=
in-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"=
ltr"><div></div><div>Here, it is not the colon the problem, but the arbitra=
ry expression on the left of the colon.</div><div>Supporting only arbitrary=
 identifier tokens on the left of the colon simplifies very much the wordin=
g of the feature: the rules are easy.<br></div></div></blockquote><div><br>=
</div><div>I see, well as I said, I wanted 100% tags coverage, besides I <i=
>really</i> like how <font face=3D"courier new,monospace">in_place&lt;strin=
g&gt;:</font> reads, but I guess it&#39;s subjective.</div><div><br></div><=
div><br></div><div>All in all I am not against what you are saying, for obv=
ious reasons, but I am skeptical if we introduce enough value.=C2=A0</div><=
div>Tags to be templates is a real-word need, tags to be in a namespaces (s=
ometimes different then the function) is real-word need.</div><div><br></di=
v><div>These can&#39;t be done by automatic introduction, not without yet e=
ven more sugar magic. =C2=A0</div><div><br></div><div>But I might be wrong,=
 these could be left for tags, may be the original idea names-are-names-per=
iod is the way to go. It is really, really hard to estimate the usefulness =
of the feature if it is not &quot;better tags&quot; - will it replace stati=
c functions for constructors? Will this be enough? Will there be an upgrade=
 path if someone decides the missing features should be added?</div><div><b=
r></div><div><br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" s=
tyle=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-le=
ft: 1ex;"><div dir=3D"ltr"><div></div><div>=C2=A0</div></div></blockquote><=
/div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/0c551714-ba3c-4590-bab2-a059be4f3f2f%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/0c551714-ba3c-4590-bab2-a059be4f3f2f=
%40isocpp.org</a>.<br />

------=_Part_2353_984946850.1533734037332--

------=_Part_2352_1538675800.1533734037330--

.