Topic: Named aguments, take 9000
Author: mihailnajdenov@gmail.com
Date: Mon, 30 Jul 2018 11:58:25 -0700 (PDT)
Raw View
------=_Part_11453_2124905378.1532977105635
Content-Type: multipart/alternative;
boundary="----=_Part_11454_481106392.1532977105638"
------=_Part_11454_481106392.1532977105638
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Here comes another post on named arguments ("keyword" arguments).
I am sure there is no need for an introduction to the topic, so I will go=
=20
straight.=20
*Part 1. Inferior workarounds*
1. "Just use types instead"
This does not work in cases where we have more then one argument of the=20
same type.
Even a trivial example like setSize(int width, int height) works only=20
because we use an implicit convention - width comes first.
Note, width and height are cross-assignable, which makes introducing a new=
=20
> type 100% superfluous.=20
Also note the high cost of maintenance of additional classes.
If we change the example to child(name mother, name father), we completely=
=20
lose expressiveness:
child("Tony Robinson", "Dustin Hana");
This solution also does not scale well with libraries which use=20
predominately basic types like integers and floats - math and physics=20
libraries are a great example of this.
Even the standard library is not an exception:
// note, angle phi and coordinate x are both the same type
sph_legendre( unsigned l, unsigned m, double =CE=B8 );
assoc_legendre( unsigned int n, unsigned int m, double x );
*// the call to such functions is, understandably, quite unclear*
sph_legendre(3, 0, 1.2345);
assoc_legendre(2, 0, .5);
2. "Just use named functions"
Named functions are poor-man's alternative to named arguments - they can't=
=20
name individual arguments and do not scale.
sph_legendre(3, 0, 1.2345); *//< named, yet still unclear*
child::withMotherAndFatherAgedWithSiblings(. . .); *//< does not scale well=
=20
to multiple arguments*
Other than that, if the function is a static function, used as "named=20
constructor", this means we lose all benefits of a constructor - library=20
and metaprogramming construction support, deduction guides, explicitness of=
=20
what creates instances, and more.
3. Use "multi-stage construction" [if you need multiple arguments in a=20
constructor]
Read more about this advice here=20
> <https://doc.qt.io/archives/qq/qq13-apis.html#theconveniencetrap>
>
This is an ok advice *as long* *as* the design of the class is not changed=
=20
to enable this kind of initialization, otherwise it is an antipattern - one=
=20
both introduces new public interfaces *and* additional mutability into the=
=20
class.
Even when it is ok, it is far from great - the constructor, along its=20
benefits, is used only partially; it is not clear if the order function=20
calls is important; you can't easily create a const variable; the solution=
=20
ends up actually extremely verbose.
4. Use "named arguments idiom=20
<http://www.cs.technion.ac.il/users/yechiel/c++-faq/named-parameter-idiom.h=
tml>
"=20
This solution does not scale and it has massive code duplications. It is=20
also by no means obvious what is expected from the user of the interface=20
and if order of calls is important.=20
5. Use an arguments aggregate class, together with designated initializers.
Multitude of issues - maintenance cost, code duplication, does not scale,=
=20
problems with overloading, the interface actually *hides* the arguments=20
into a new object, implementation is *severely* affected by the interface.
6. Lastly, almost all of the alternatives have an additional drawback - *th=
e=20
naming is mandatory. *In practice, we often have variables, which can stand=
=20
in for the arguments names.
const auto mother =3D ". . .";
const auto father =3D ". . .";
child::withMotherAndFather(mother, father); //< needlessly verbose=20
*Part 2. Problematic solutions*
1. "Just works"
This solution envisions C/C++ arguments be used as-they-are and the client=
=20
opts-in to get a warning on mismatch.=20
First, there is the fundamental problem with the fact that something, which=
=20
has been private for 40+ years, is now essentially made public. This is=20
wrong on its own.=20
Even if we ignore that, the solution is not practical:
- Different implementations have different naming (and we can't force=20
standardization of *all* arguments, forever);=20
- Any change in the implementation naming will trigger false positives=
=20
(and the majority of the library code has no separate implementation)
- This solution is too taxing for library creators - suddenly we *demand=
*,=20
*stable* arguments for *all* your interfaces, *forever. And you have=20
nothing to do about it.*
- No interface ever needs all arguments named.
- Warnings are actually not good enough - the type of problems, rising=
=20
from wrong arguments are just too severe, as they are, in a way, a *brea=
ch=20
of contract*.
2. "It must [just] work with the standard library"=20
This requirement is unfounded.=20
Most if not all of the arguments made in "Just works" apply here as well,=
=20
but there is one additional observation - the standard library does not=20
really *need* named arguments.
The reason for this is simply, because *it was designed that way*. There=20
are multiple ways, used to get around current limitations, first and=20
foremost - named functions, but also use of types (chrono) and small number=
=20
of similar arguments (algorithms)=20
This is not to say, the standard library can't take advantage of named=20
arguments, but this can happen only in specific places and after careful=20
consideration - the standard library will *never* need *all* arguments to=
=20
be named!=20
3. The developer [just] marks arguments to become names
This has the reverse problem such as, the public interfaces dictates the=20
implementation - the library author is forced to use names, not helpful to=
=20
him, but helpful to the client, calling the function.
This is not good. In a way, for the client to win, the author has to lose,=
=20
yet it is the library author who actually *uses* these arguments!=20
4. "Names must be mandatory/part of the signature"
This is a non-starter for C++ because of generic code and variadic=20
forwarding.
Besides, tag arguments fit that role already, and we can improve on that.=
=20
<https://groups.google.com/a/isocpp.org/d/msg/std-proposals/tPtdQE2GXb0/4Oj=
T5Z4pBQAJ>
Part 3. Suggested approach
1. Names are separate from the arguments. This leaves the implementation=20
free to change the names it uses and also lets user-facing names be=20
specifically designed to be a public interface.
child(name mother: mom, name father: dad);=20
copy(const Path& src, const Path& to: dst); *//< copy("/path/to/image", to:=
=20
"/some/other/path"**)*
replace(const QByteArray& ol, const QByteArray& with: nw) *//<=20
var.replace("yes", with: "no") *
replace(int at: pos, int count: len, const QByteArray& with: after) *//<=20
var.replace(at: 5, count: 4, with: "Bye")*
template<class D, class K>
setData(D&& v, const K& forKey: key); *//< setData("data"s, forKey:=20
"one"s); *
If the argument is omitted, the name can be reused as an argument, but only=
=20
if there is no default value.
slider(int value:, pair<int, int> range: minmax =3D {0, 99});
2. Names are not mandatory and don't change the signature
As mentioned, often times we have suitably named arguments, no need for=20
extra verbosity, be it as a function or argument name:
copy(path, destpath); //< clear enough
Pointers and function objects are not names-aware:
using p =3D void(const Path&, const Path&);
p =3D ©
p("/path/to/image", "/some/other/path");
//p("/path/to/image", to: "/some/other/path"); //< error
p =3D &rename; *//< allowed*
3. Names are declared using the same rules as default arguments - only one=
=20
visible declaration must have names.
namespace {
auto child(name mother: mom, name dad);=20
// auto child(name mother: mom, name dad); //< error
// auto child(name mom: mom, name dad); //< error
auto child(name mutter, vater);=20
auto child(name mother, name father)
{
. . .=20
}
}//< ns
4. The argument name is a compiler-brokered "handshake" b/w the library=20
author and the user and both must agree on it.=20
It is an error to pass a name to an argument that it is not declared to=20
have name.
void func(int arg);
// user
func(arg: 5); //< error
There is one exception. If, and only if, the argument is forwarding=20
reference *and* it is forwarded,
then the forwarding function is allowed to be called with an argument name,=
=20
even if one is not declared for that argument.
5. Because names are purely compile time, and perfect forwarding is always=
=20
inline, names are able to change call sites.
This is done by the compiler alone, by prepending calls to std::forward=20
with the name, used on the forwarded argument, for the call of the=20
enclosing function.
void func(int& foo: arg);
template<class T>
void fwdfunc(T&& arg) *//< no name for the argument*
{ =20
func(std::forward<T>(arg));
}
// user
int val =3D 5;
fwdfunc(foo: val) *//< allowed*
// generates
void fwdfunc(int& && arg)=20
{ =20
func(std::forward<int&>(arg));=20
*// =3D> func(foo: std::forward<int&>(arg))*
*// =3D> func(foo: int&)*
}
If the forwarding function declares a name for that argument, the user=20
specified name is checked against that name instead and std::forward is=20
called normally.
6. Calling a function with a name for an argument, but with no value for=20
that argument, implies default value.
This rule has two important applications.
First it allows us to explicitly pass defaulted arguments.
func(int a, int b: b =3D 10. int c: c =3D -1, string text =3D "hello");
func(10, b:, c:, "bye");
Second, it enables using default arguments in environments where default=20
arguments are currently considered bad practice.
func(Somethings some, M magic: m =3D "goodMagic");
func(something, magic:); *//< clear, magic is involved*
7. Names do *not* contribute to overload resolution.
Argument names are not part of the type system and not part of the function=
=20
name, they are last minute confirmation, a handshake, after all the details=
=20
are resolved.=20
This way we don't complicate overload resolution further and prevent=20
wrongly remembered, and/or wrongly typed, names to pick the incorrect=20
overload or to fail finding an overload at all.
Letting names "guide" or "early out" overloading means making them stronger=
=20
or equal to types which is unsound, considering they are optional and not=
=20
part of the name/signature or the function.
In other words, the times names will help will eventually be countered by=
=20
the times names will get in the way, yet in the former case, changes to the=
=20
overloading are needed. That's a bad trade off.
Part 4. What about the standard library?
As said, the standard library as a whole does not really need named=20
arguments, yet some improvements could be made.
Some interfaces could be streamlined and some - made more clear. =20
For example the _n versions for most algorithms introduce this new function=
=20
name not because the function does something different, but only to make=20
the calls more clear.
This task could ideally be accomplished by a single named argument:
void fill( OutputIt first, Size count: count, const T& value );
With this interface the user is free to name the, probably confusing,=20
argument
fill(begin, 5, -1); *//< confusing (but correct - all fill()-s are under=20
the same name)*
fill(begin, count: 5, -1); *//< clear*
fill(begin, count, -1); *//< also clear, without unneeded=20
over-specifications*
Even more interesting is the case with search_n. Few things make this=20
interesting.=20
First is the fact, that although it ends with _n, yet this indicates=20
something completely different then with all other algorithms.
The suffix does not indicate the count of items to operate on, but the=20
count of consecutive values, equal to the 'value' argument.=20
Second, the suffix does not help making the call more clear, not to the=20
slightest, but what is more interesting -* making the arguments names=20
public, does not make things any more clear either!*
What we need instead is, actually to do a design work on a argument name,=
=20
or couple of argument names, in order to make the interface clear and=20
understandable.=20
Here are few suggestions to highlight the possibilities=20
FrwIt search( FrwIt first, FrwIt last, Size encounters: count, const T&=20
ofValue: value );=20
FrwIt search( FrwIt first, FrwIt last, Size consecutiveItems: count, const=
=20
T& equalTo: value );=20
FrwIt search( FrwIt first, FrwIt last, const T& forValue: value, Size=20
repeated: count );
// use
search(begin, end, encounters: 5, ofValue: 0);
search(begin, end, consecutiveItems: 5, equalTo: 0);
search(begin, end, forValue: 0, repeated: 5);
This shows clearly, named arguments have *no alternative* when it comes to=
=20
expressiveness. It also shows the importance of them being optional, as=20
well as being separate from the argument.
Let's see some more examples where using named arguments make the code=20
notably more clear
create_directory("path/to/directory", attributesFrom: "path/to/file");
nth_element(begin, partitionPoint: (end - begin)*.33, end);
replace(begin, end, 5, with: 1);
sample(begin, end, begin1, samples: 1000, gen);
copysign(2, from: -1 );=20
assoc_laguerre(n: 1, m: 10, x: 0.5);
sph_legendre(n: 3, m: 0, theta: 1.2345);
ellint_1(k: 0, phi: acos(-1)/2);
It bears repeating, names are optional - the user is free to use them only=
=20
where he considers, there is a need for them.
Part 5. What makes this different the other named arguments proposals?
1. Argue, names need to different from the argument they represent, *most=
=20
of the time*, not by exception.
2. Argue, no API needs all arguments named. Names must have targeted,=20
carefully designed use. This includes the standard library.
For example, there is an overarching convention in the standard library,=20
that algorithms take an input range as the first two arguments. These don't=
=20
need to be named. Some algorithms, which write the result to a new=20
location, take an output iterator as a third argument. This argument should=
=20
be named, but it is not essential. And then, there is the regex library,=20
which takes output as the first argument. This argument really should be=20
named as it breaks any previous conventions.
regex_replace(out: begin1, begin, end, vowel, "*");
This way the code is both self-documenting and more resilient to calling=20
the incorrect overload.
3. Argue, "forwarding" of names is doable without involving the type system=
..
4. Argue, not contributing to the overload resolution is a good thing.=20
Conclusion
Contrary to the common perception, named arguments are actually an enabling=
=20
technology - they enable interfaces, impractical or even dangerous=20
otherwise.=20
When used for constructors they promote immutability and minimalistic=20
public interface. For regular functions, they promote natural function=20
naming - what the function does - and natural number of arguments, not=20
limited by readability. They lower maintenance cost and code size by=20
eliminating superficial constructs, used to work around lack of named=20
arguments.
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/98f60883-3cd6-42a3-b3d6-ca67d0ac60e5%40isocpp.or=
g.
------=_Part_11454_481106392.1532977105638
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>Here comes another post on named arguments ("key=
word" arguments).</div><div><br></div><div>I am sure there is no need =
for an introduction to the topic, so I will go straight.=C2=A0</div><div><b=
r></div><div><br></div><div><b>Part 1. I<span style=3D"text-align: left; co=
lor: rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacin=
g: normal; font-family: "Arial","Helvetica",sans-serif;=
font-size: 13px; font-style: normal; font-variant: normal; text-decoration=
: none; word-spacing: 0px; display: inline !important; white-space: normal;=
orphans: 2; float: none; -webkit-text-stroke-width: 0px; background-color:=
transparent;">nferior workarounds</span></b></div><div><b></b><i></i><u></=
u><sub></sub><sup></sup><strike></strike><b></b><br></div><div>1. "Jus=
t use types instead"</div><div><br></div><div>This does not work in ca=
ses where we have more then one argument of the same type.</div><div><br></=
div><div>Even a trivial example like <font face=3D"courier new,monospace">s=
etSize(int width, int height)</font> works only because we use an implicit =
convention - width comes first.</div><div><br></div><blockquote class=3D"gm=
ail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-le=
ft-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: so=
lid;">Note, width and height are cross-assignable, which makes introducing =
a new type 100% superfluous.=C2=A0</blockquote><blockquote class=3D"gmail_q=
uote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-co=
lor: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;"=
>Also note the high cost of maintenance of additional classes.</blockquote>=
<div><br></div><div>If we change the example to <font face=3D"courier new,m=
onospace">child(name mother, name father)</font>, we completely lose expres=
siveness:</div><br><div><font face=3D"courier new,monospace"><font face=3D"=
"Arial","Helvetica",sans-serif"></font>child("Tony=
Robinson", "Dustin Hana");</font></div><div><font face=3D"c=
ourier new,monospace"><br></font></div><div><font face=3D"arial,sans-serif"=
>This solution also does not scale well with libraries which use predominat=
ely basic types like integers and floats - math and physics libraries are a=
great example of this.</font></div><div><font face=3D"arial,sans-serif">Ev=
en the standard library is not an exception:</font><br></div><div><br></div=
><div><span style=3D"text-align: left; color: rgb(34, 34, 34); text-transfo=
rm: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-s=
tyle: italic; font-variant: normal; font-weight: 400; text-decoration: none=
; word-spacing: 0px; display: inline !important; white-space: normal; orpha=
ns: 2; float: none; -webkit-text-stroke-width: 0px; background-color: trans=
parent;"><font face=3D"courier new,monospace">// note, angle phi and coordi=
nate x are both the same type</font></span></div><div><b></b><i></i><u></u>=
<sub></sub><sup></sup><strike></strike><font face=3D"courier new,monospace"=
></font><br></div><font face=3D"courier new,monospace">sph_legendre( unsign=
ed l, unsigned m, double =CE=B8 );<br></font><div><font face=3D"courier new=
,monospace">assoc_legendre( unsigned int n, unsigned int m, double x );</fo=
nt></div><div><font face=3D"courier new,monospace"><br></font></div><div><f=
ont face=3D"courier new,monospace"><i>// the call to such functions is, und=
erstandably, quite unclear</i></font></div><div><font face=3D"arial,sans-se=
rif"><i></i><br></font></div><div><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;">sph_legendre(3, 0, 1.2345);</span></font></di=
v><font face=3D"courier new,monospace">assoc_legendre(2, 0, .5);</font><div=
><font face=3D"arial,sans-serif"><br></font></div><div><font face=3D"arial,=
sans-serif"><br></font></div><div>2<font face=3D"arial,sans-serif"><span st=
yle=3D"display: inline !important; float: none; background-color: transpare=
nt; color: rgb(34, 34, 34); font-family: "Arial","Helvetica&=
quot;,sans-serif; 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;">. "Just us=
e named functions"</span><b></b><i></i><u></u><sub></sub><sup></sup><s=
trike></strike></font></div><div><font face=3D"arial,sans-serif"><br></font=
></div><div><font face=3D"arial,sans-serif">Named functions are poor-man=
9;s alternative to named arguments - they can't name individual argumen=
ts and do not scale.</font></div><div><font face=3D"arial,sans-serif"><br><=
/font></div><div><font face=3D"arial,sans-serif"><span 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); displ=
ay: inline; float: none; font-family: courier new,monospace; 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;">sph_legendre(<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;">3, 0, 1.2345</span>); <i>//< named, yet still unclear</i></span><=
/font></div><div><font face=3D"arial,sans-serif"><br></font></div><div><fon=
t face=3D"courier new,monospace">child::withMotherAndFatherAgedWithSiblings=
(. . .); <i>//< does not scale well to multiple arguments</i></font></di=
v><div><font face=3D"arial,sans-serif"><br></font></div><div><font face=3D"=
arial,sans-serif">Other than that, if the function is a static function, us=
ed as "named constructor", this means we lose all benefits of a c=
onstructor - library and=C2=A0<span style=3D"display: inline !important; fl=
oat: none; background-color: transparent; color: rgb(34, 34, 34); font-fami=
ly: arial,sans-serif; font-size: 13px; font-style: normal; font-variant: no=
rmal; font-weight: 400; letter-spacing: normal; orphans: 2; 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;">metaprogram=
ming</span> construction support, deduction guides, explicitness of what cr=
eates instances, and more.</font></div><div><font face=3D"arial,sans-serif"=
><br></font></div><div><font face=3D"arial,sans-serif"><br></font></div><di=
v><font face=3D"arial,sans-serif">3.=C2=A0 Use "multi-stage constructi=
on" [if you need multiple arguments in a constructor]</font></div><div=
><font face=3D"arial,sans-serif"><br></font></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;"><font face=3D"arial,sans-serif">Read more about this advice </font=
><font face=3D"arial,sans-serif"><a href=3D"https://doc.qt.io/archives/qq/q=
q13-apis.html#theconveniencetrap">here</a><br></font></blockquote></div><di=
v><font face=3D"arial,sans-serif"><br></font></div><div><font face=3D"arial=
,sans-serif">This is an ok advice <i>as long</i> <i>as</i> the design of th=
e class is not changed to enable this kind of initialization, otherwise it =
is an antipattern - one both introduces new public interfaces <i>and</i> ad=
ditional mutability into the class.</font></div><div><font face=3D"arial,sa=
ns-serif"><br></font></div><div><font face=3D"arial,sans-serif">Even when i=
t is ok, it is far from great - the constructor, along its benefits, is use=
d only partially; it is not clear if the order function calls is important;=
you can't easily create a const variable; the solution ends up actuall=
y extremely verbose.</font></div><div><font face=3D"arial,sans-serif"><br><=
/font></div><div><font face=3D"arial,sans-serif"><br></font></div><div><fon=
t face=3D"arial,sans-serif">4. Use "<a href=3D"http://www.cs.technion.=
ac.il/users/yechiel/c++-faq/named-parameter-idiom.html">named arguments idi=
om</a>"=C2=A0</font></div><div><font face=3D"arial,sans-serif"><br></f=
ont></div><div><font face=3D"arial,sans-serif">This solution does not scale=
and it has massive code duplications. It is also by no means obvious what =
is expected from the user of the interface and if order of calls is importa=
nt.=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"a=
rial,sans-serif">5. Use an arguments aggregate class, together with <span s=
tyle=3D"display: inline !important; float: none; background-color: transpar=
ent; color: rgb(0, 0, 0); font-family: DejaVuSans,"DejaVu Sans",a=
rial,sans-serif; font-size: 12.8px; font-style: normal; font-variant: norma=
l; font-weight: 400; letter-spacing: normal; line-height: 15.36px; orphans:=
2; text-align: left; text-decoration: none; text-indent: 0px; text-transfo=
rm: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing=
: 0px;">designated initializers.</span></font></div><div><font face=3D"aria=
l,sans-serif"><br></font></div><div><font face=3D"arial,sans-serif">Multitu=
de of issues - m</font><font face=3D"arial,sans-serif">aintenance cost, cod=
e duplication<span style=3D"display: inline !important; float: none; backgr=
ound-color: transparent; color: rgb(34, 34, 34); font-family: arial,sans-se=
rif; 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;">, does not scale</span>, pro=
blems with overloading<span style=3D"display: inline !important; float: non=
e; background-color: transparent; color: rgb(34, 34, 34); font-family: aria=
l,sans-serif; 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;">, the interface act=
ually </span><i style=3D"background-attachment: scroll; background-clip: bo=
rder-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-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: arial,sans-serif; font-size: 13px; f=
ont-style: italic; font-variant: normal; font-weight: 400; height: auto; le=
tter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0=
px; margin-top: 0px; min-width: 0px; orphans: 2; overflow: visible; overflo=
w-x: visible; overflow-y: visible; 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;">hides</i><span style=3D"display: =
inline !important; float: none; background-color: transparent; color: rgb(3=
4, 34, 34); font-family: arial,sans-serif; font-size: 13px; font-style: nor=
mal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphan=
s: 2; text-align: left; text-decoration: none; text-indent: 0px; text-trans=
form: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spaci=
ng: 0px;"> the arguments into a new object</span>, implementation is <i>sev=
erely</i> affected by the interface.</font></div><div><font face=3D"arial,s=
ans-serif"><br></font></div><div><font face=3D"arial,sans-serif"><br></font=
></div><div><font face=3D"arial,sans-serif">6. Lastly, almost all of the al=
ternatives have an additional=C2=A0</font>drawback - <font face=3D"arial,sa=
ns-serif"><i>the naming is mandatory. </i></font>In practice,<font face=3D"=
arial,sans-serif"> we often have variables, which can stand in for the argu=
ments names.</font></div><div><font face=3D"arial,sans-serif"><br></font></=
div><div><font face=3D"courier new,monospace">const auto mother =3D ".=
. .";</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: 400=
; text-decoration: none; word-spacing: 0px; display: inline !important; whi=
te-space: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; =
background-color: transparent;"><font face=3D"courier new,monospace">const =
auto father =3D ". . .";</font></span><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"courier new,monospace"></fon=
t><br></div><div><font face=3D"courier new,monospace">child::withMotherAndF=
ather(mother, father); //< needlessly verbose=C2=A0</font><br></div><div=
><font face=3D"courier new,monospace"></font><br></div><div><br></div><div>=
<font face=3D"arial,sans-serif"><b><br></b></font></div><div><font face=3D"=
arial,sans-serif"><b>Part 2. Problematic solutions</b></font></div><div><fo=
nt face=3D"arial,sans-serif"><b><br></b></font></div><div><font face=3D"ari=
al,sans-serif"><b><br></b></font></div><div>1. "Just works"</div>=
<div><br></div><div>This solution envisions C/C++ arguments be used as-they=
-are and the client opts-in to get a warning on mismatch.=C2=A0</div><div><=
br></div><div>First, there is the fundamental problem with the fact that so=
mething, which has been private for 40+ years, is now essentially made publ=
ic. This is wrong on its own.=C2=A0</div><div>Even if we ignore that, the s=
olution is not practical:</div><ul><li>Different implementations have diffe=
rent naming (and we can't force standardization of <i>all</i> arguments=
, forever);=C2=A0</li><li>Any change in the implementation naming will trig=
ger false positives (and the majority of the library code has no separate i=
mplementation)</li><li>This solution is too taxing for library creators - s=
uddenly we <i>demand</i>, <i>stable</i> arguments for <i>all</i> your inter=
faces, <i>forever. And you have nothing to do about it.</i></li><li>No inte=
rface ever needs all arguments named.<br></li><li>Warnings are actually not=
good enough - the type of problems, rising from wrong arguments are just t=
oo severe, as they are, in a way, a <i>breach of contract</i>.</li></ul><di=
v><br></div><div>2. "It must [just] work with the standard library&quo=
t;=C2=A0</div><div><br></div><div>This requirement is unfounded.=C2=A0</div=
><div>Most if not all of the arguments made in=C2=A0<span style=3D"display:=
inline !important; float: none; background-color: transparent; color: rgb(=
34, 34, 34); font-family: "Arial","Helvetica",sans-seri=
f; 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: 0=
px; white-space: normal; word-spacing: 0px;"> "Just works"</span>=
apply here as well, but there is one additional observation - the standard=
library does not really <i>need</i> named arguments.</div><div>The reason =
for this is simply, because <i>it was designed that way</i>. There are mult=
iple ways, used to get around current limitations, first and foremost - nam=
ed functions, but also use of types (chrono) and small number of similar ar=
guments (algorithms)=C2=A0</div><div><br></div><div>This is not to say, the=
standard library can't take advantage of named arguments, but this can=
happen only in specific places and after careful consideration - the stand=
ard library will <i>never</i> need <i>all</i> arguments to be named!=C2=A0<=
/div><div><br></div><div><br></div><div>3. The developer=C2=A0<span style=
=3D"display: inline !important; float: none; background-color: transparent;=
color: rgb(34, 34, 34); font-family: "Arial","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;">[just]</span> mark=
s arguments to become names</div><div><br></div><div>This has the reverse p=
roblem such as, the public interfaces dictates the implementation - the lib=
rary author is forced to use names, not helpful to him, but helpful to the =
client, calling the function.</div><div>This is not good. In a way, f<span =
style=3D"display: inline !important; float: none; background-color: transpa=
rent; color: rgb(34, 34, 34); font-family: "Arial","Helvetic=
a",sans-serif; font-size: 13px; font-style: normal; font-variant: norm=
al; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left;=
text-decoration: none; text-indent: 0px; text-transform: none; -webkit-tex=
t-stroke-width: 0px; white-space: normal; word-spacing: 0px;">or the client=
to win, the author has to lose, yet </span>it is the=C2=A0<span style=3D"d=
isplay: inline !important; float: none; background-color: transparent; colo=
r: rgb(34, 34, 34); font-family: "Arial","Helvetica",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;">library author who actu=
ally <i>uses</i> these arguments!=C2=A0</span></div><font face=3D"arial,san=
s-serif"><b></b><div><i></i><b></b><i></i><u></u><sub></sub><sup></sup><str=
ike></strike><br></div><div><br></div><div>4. "Names must be mandatory=
/part of the signature"</div><div><br></div><div>This is a non-starter=
for C++ because of generic code and variadic forwarding.</div><div><br></d=
iv><div>Besides, tag arguments fit that role already, <a href=3D"https://gr=
oups.google.com/a/isocpp.org/d/msg/std-proposals/tPtdQE2GXb0/4OjT5Z4pBQAJ">=
and we can improve on that.</a><br></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-si=
ze: 13px; font-style: normal; font-variant: normal; font-weight: 700; lette=
r-spacing: normal; orphans: 2; text-align: left; text-decoration: none; tex=
t-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-=
space: normal; word-spacing: 0px;">Part 3. Suggested approach</span><br></d=
iv><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><br></div><div><br></d=
iv><div>1. Names are separate from the arguments. This leaves the implement=
ation free to change the names it uses and also lets user-facing names be s=
pecifically designed to be a public interface.</div><div><br></div></font><=
div><font face=3D"courier new,monospace">child(name mother: mom, name fathe=
r: dad);=C2=A0</font></div><div><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: 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;"><b></b=
><i></i><u></u><sub></sub><sup></sup><strike></strike><i></i><br></font></f=
ont></div><div><div style=3D"background-color: transparent; border-bottom-c=
olor: 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-ri=
ght-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-w=
idth: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&=
amp;quot;Helvetica&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: 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-trans=
form: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spaci=
ng: 0px;"><font face=3D"courier new,monospace"><font face=3D"courier new,mo=
nospace" 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;">copy(const Path& src, co=
nst Path& to: dst); <i>//< copy("/path/to/image", to: &quo=
t;/some/other/path"</i></font></font><font face=3D"courier new,monospa=
ce"><font face=3D"courier new,monospace" 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;"><i>)</i></font></font></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: &quot;=
Arial&quot;,&quot;Helvetica&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 face=3D"courier new,monospace"><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;"><i></i><br=
></font></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: &quot;Arial&q=
uot;,&quot;Helvetica&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"><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;">replace(const QByteArr=
ay& ol, const QByteArray& with: nw) <i style=3D"background-attachme=
nt: scroll; background-clip: border-box; background-color: transparent; bac=
kground-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; 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: couri=
er new,monospace; font-size: 13px; height: auto; margin-bottom: 0px; margin=
-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: v=
isible; overflow-x: visible; overflow-y: visible; padding-bottom: 0px; padd=
ing-left: 0px; padding-right: 0px; padding-top: 0px;"><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: italic; 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;">//< var.replace("yes", with=
: "no")</span>=C2=A0</i><span style=3D"background-color: transpar=
ent; border-bottom-color: rgb(38, 40, 42); 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(38, 40, 42); border-left-style: none; border-left-w=
idth: 0px; border-right-color: rgb(38, 40, 42); border-right-style: none; b=
order-right-width: 0px; border-top-color: rgb(38, 40, 42); border-top-style=
: none; border-top-width: 0px; color: rgb(38, 40, 42); display: inline; flo=
at: none; font-family: &quot;Titillium Web&quot;,Arial,Helvetica,sa=
ns-serif; font-size: 23.33px; font-style: normal; font-variant: normal; fon=
t-weight: 300; 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; word-wrap: break-wo=
rd;"></span><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br=
></font></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: &quot;Arial&q=
uot;,&quot;Helvetica&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;"><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike=
><br></div><font face=3D"courier new,monospace">replace(int at: pos, int co=
unt: len, const QByteArray& with: after) <i>//< var.replace(at: 5, c=
ount: 4, with: "Bye")</i></font><br></div><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: &quot;Arial&quot;,&quot;Helvetica&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;"><b></b><i></i><u></u><s=
ub></sub><sup></sup><strike></strike><font face=3D"courier new,monospace"><=
/font><br></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-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: &quot;Arial&quot;,=
&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: norm=
al; 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-tran=
sform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spac=
ing: 0px;"><font face=3D"courier new,monospace">template<class D, class =
K></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: &quot;Arial&quot=
;,&quot;Helvetica&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">setData(D&& v, co=
nst K& forKey: key); <i>//< setData("data"s, forKey: "=
;one"s);=C2=A0</i></font><font face=3D"courier new,monospace"><i><br><=
/i></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-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: &quot;Arial&quot;,=
&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: norm=
al; 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-tran=
sform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spac=
ing: 0px;"><br></div></div>If the argument is omitted, the name can be reus=
ed as an argument, but only if there is no default value.<br><div><font fac=
e=3D"courier new,monospace"><br></font></div><div><font face=3D"courier new=
,monospace">slider(int value:, <span style=3D"display: inline !important; f=
loat: none; background-color: transparent; color: rgb(34, 34, 34); font-fam=
ily: courier new,monospace; font-size: 13px; font-style: normal; font-varia=
nt: normal; font-weight: 400; letter-spacing: normal; orphans: 2; 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;">pair&=
lt;int, int> range: minmax =3D {0, 99}</span>);</font></div><div><br></d=
iv><div><br></div><div>2. Names are not mandatory and don't change the =
signature</div><div><br></div><div>As mentioned, often times we have suitab=
ly named arguments, no need for extra verbosity, be it as a function or arg=
ument name:</div><div><br></div><div><font face=3D"courier new,monospace">c=
opy(path, destpath); //< clear enough</font><font face=3D"courier new,mo=
nospace"><br></font></div><div><font face=3D"courier new,monospace"><b></b>=
<i></i><u></u><sub></sub><sup></sup><strike></strike><br></font></div>Point=
ers and function objects are not names-aware:<div><font face=3D"courier new=
,monospace"><i></i><br></font></div><div><font face=3D"courier new,monospac=
e">using p =3D void(<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;">const Path&,=
const Path&</span>);</font></div><div><font face=3D"courier new,monosp=
ace">p =3D &copy;</font></div><div><font face=3D"courier new,monospace"=
><br></font></div><div><font face=3D"courier new,monospace">p("/path/t=
o/image", "/some/other/path"<font face=3D"courier new,monosp=
ace" 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: courier new,monospace; 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></font>);</font><font face=3D"courier new,m=
onospace"><br></font></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"courier new,monospace">//p("/path/to/image", to: &=
quot;/some/other/path"<font face=3D"courier new,monospace" 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: courier new,monospace; 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;"><font face=3D"courier new,monospace" style=3D"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; 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;"></font></font>); //< error</font></div><div><font face=3D"couri=
er new,monospace"><br></font></div><div><font face=3D"courier new,monospace=
">p =3D &<span style=3D"display: inline !important; float: none; backgr=
ound-color: transparent; color: rgb(34, 34, 34); font-family: courier new,m=
onospace; 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;">rename; <i>//< allow=
ed</i></span></font></div><div><font face=3D"courier new,monospace"><b></b>=
<i></i><u></u><sub></sub><sup></sup><strike></strike><i></i><br></font></di=
v><div><font face=3D"courier new,monospace"><br><font face=3D"courier new,m=
onospace" style=3D"background-color: transparent; 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: courier new,monospace; 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;"></font></font></div><div><font face=3D"arial,=
sans-serif">3. Names are declared using the same rules as default arguments=
- only one visible declaration must have names.</font></div><div><font fac=
e=3D"arial,sans-serif"><br></font></div><div><font face=3D"courier new,mono=
space">namespace {</font></div><div><font face=3D"courier new,monospace"><b=
r></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: 400; text-de=
coration: none; word-spacing: 0px; display: inline !important; white-space:=
normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; backgroun=
d-color: transparent;"><font face=3D"courier new,monospace">auto child(name=
mother: mom, name dad);=C2=A0</font></span></div><div>// <span 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); display: inline; float: none; font-family: &quot;Arial&quot;,&a=
mp;quot;Helvetica&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;"><font face=3D"courier new,monospace" style=3D"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; 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;">auto child(name mother: mom, name dad); //< error</font></span>=
</div><div><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-t=
ransform: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; =
font-variant: normal; word-spacing: 0px; display: inline; white-space: norm=
al; orphans: 2; float: none; -webkit-text-stroke-width: 0px; background-col=
or: transparent;"><font face=3D"courier new,monospace" 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;"><span style=3D"display: inline !important; float: none; b=
ackground-color: transparent; color: rgb(34, 34, 34); font-family: "Ar=
ial","Helvetica",sans-serif; font-size: 13px; font-style: no=
rmal; font-variant: normal; font-weight: 400; letter-spacing: normal; orpha=
ns: 2; text-align: left; text-decoration: none; text-indent: 0px; text-tran=
sform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spac=
ing: 0px;">// </span><span 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); display: inline; float: none; fon=
t-family: &quot;Arial&quot;,&quot;Helvetica&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;"><font face=3D"courier new,mo=
nospace" 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;">auto child(name mom: mom, na=
me dad); //< error</font></span><b></b><i></i><u></u><sub></sub><sup></s=
up><strike></strike><br></font></span></div><div><span style=3D"text-align:=
left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px; lett=
er-spacing: normal; font-size: 13px; font-style: normal; font-variant: norm=
al; font-weight: 400; text-decoration: none; word-spacing: 0px; display: in=
line !important; white-space: normal; orphans: 2; float: none; -webkit-text=
-stroke-width: 0px; background-color: transparent;"><font face=3D"courier n=
ew,monospace">auto child(name mutter, vater);=C2=A0</font></span><b></b><i>=
</i><u></u><sub></sub><sup></sup><strike></strike></div><div><span style=3D=
"display: inline !important; float: none; background-color: transparent; co=
lor: 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: nor=
mal; word-spacing: 0px;">auto child(name mother, name father)</span></div><=
div><font face=3D"courier new,monospace">{</font></div><div><font face=3D"c=
ourier new,monospace">=C2=A0 . . .=C2=A0</font></div><div><font face=3D"cou=
rier new,monospace">}</font></div><div><font face=3D"courier new,monospace"=
><br></font></div><div><font face=3D"courier new,monospace">}//< ns</fon=
t></div><div><font face=3D"courier new,monospace"></font><br></div><br><div=
>4. The argument name is a compiler-brokered "handshake" <span st=
yle=3D"display: inline !important; float: none; background-color: transpare=
nt; color: rgb(34, 34, 34); font-family: "Arial","Helvetica&=
quot;,sans-serif; 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;">b/w the library=
author and the user and b</span>oth must agree on it.=C2=A0</div><div><br>=
</div><div>It is an error to pass a name to an argument that it is not decl=
ared to have name.</div><div><font face=3D"courier new,monospace"></font><b=
r></div><div><span 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); display: inline; float: none; font-family=
: &quot;Arial&quot;,&quot;Helvetica&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;">void func(int arg);</font></span></d=
iv><div><b style=3D"background-attachment: scroll; background-clip: border-=
box; background-color: transparent; background-image: none; background-orig=
in: padding-box; background-position-x: 0%; background-position-y: 0%; back=
ground-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-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; col=
or: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helve=
tica&quot;,sans-serif; font-size: 13px; font-style: normal; font-varian=
t: normal; font-weight: 700; height: auto; letter-spacing: normal; margin-b=
ottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width=
: 0px; orphans: 2; overflow: visible; overflow-x: visible; overflow-y: visi=
ble; 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;"></b><i 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: &quot;Arial&quot;,&qu=
ot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: italic; fon=
t-variant: normal; font-weight: 400; height: auto; letter-spacing: normal; =
margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; m=
in-width: 0px; orphans: 2; overflow: visible; overflow-x: visible; overflow=
-y: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; pa=
dding-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;"></i><u style=3D"background-attachment: scroll; backgrou=
nd-clip: border-box; background-color: transparent; background-image: none;=
background-origin: padding-box; background-position-x: 0%; background-posi=
tion-y: 0%; background-repeat: repeat; background-size: auto; 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: &quot;Arial&quot;=
,&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: nor=
mal; font-variant: normal; 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; padding-bottom: 0px; padding-left: 0px; padding-right:=
0px; padding-top: 0px; text-align: left; text-decoration: underline; text-=
indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-sp=
ace: normal; word-spacing: 0px;"></u><sub 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: &=
quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 9=
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;"></sub><sup 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: &=
quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 9=
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;"></sup><strike 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&quot;,&quot;Helvetica&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: line-thro=
ugh; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px=
; white-space: normal; word-spacing: 0px;"></strike><b></b><i></i><u></u><s=
ub></sub><sup></sup><strike></strike><font face=3D"courier new,monospace"><=
/font><br></div><div><font face=3D"courier new,monospace">// user</font></d=
iv><div><font face=3D"courier new,monospace"></font><br></div><div><font fa=
ce=3D"courier new,monospace">func(arg: 5); //< error</font></div><div><b=
></b><i></i><u></u><sub></sub><sup></sup><strike></strike><font face=3D"cou=
rier new,monospace"></font><br></div><div>There is one exception. If, and o=
nly if, the argument is forwarding reference <i>and</i> it<span style=3D"di=
splay: inline !important; float: none; background-color: transparent; color=
: rgb(34, 34, 34); font-family: "Arial","Helvetica",san=
s-serif; font-size: 13px; font-style: normal; font-variant: normal; font-we=
ight: 400; letter-spacing: normal; orphans: 2; 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;"> is forwarded,</span></d=
iv><div><span style=3D"display: inline !important; float: none; background-=
color: transparent; color: rgb(34, 34, 34); font-family: "Arial",=
"Helvetica",sans-serif; font-size: 13px; font-style: normal; font=
-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; 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;"=
>then the forwarding function is allowed to be called with an argument name=
, even if one is not declared for that argument.</span></div><div><i></i><i=
></i><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></div>=
<div><br></div><div>5. Because names are purely compile time, and perfect f=
orwarding is always inline, names are able to change call sites.</div><div>=
<br></div><div>This is done by the compiler alone, by prepending calls to <=
font face=3D"courier new,monospace">std::forward</font> with the name, used=
on the forwarded argument, for the call of the enclosing function.</div><d=
iv><font face=3D"courier new,monospace"></font><br></div><div><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"courier new,monospace">void func(int& foo: arg);</font></span><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><font face=3D"courier new,monospac=
e">template<class T></font></div><div><font face=3D"courier new,monos=
pace">void fwdfunc(T&& arg) <i>//< no name for the argument</i><=
/font></div><div><font face=3D"courier new,monospace">{ =C2=A0</font></div>=
<div><font face=3D"courier new,monospace">=C2=A0 func(std::forward<T>=
(arg));</font></div><div><font face=3D"courier new,monospace">}</font></div=
><div><font face=3D"courier new,monospace"></font><br></div><div><font face=
=3D"courier new,monospace">// user</font></div><div><font face=3D"courier n=
ew,monospace"></font><br></div><div><font face=3D"courier new,monospace">in=
t val =3D 5;</font></div><div><span style=3D"text-align: left; color: rgb(3=
4, 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; display: inline !important; wh=
ite-space: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px;=
background-color: transparent;"><font face=3D"courier new,monospace">fwdfu=
nc(foo: val) <i>//< allowed</i></font></span></div><div><font face=3D"co=
urier new,monospace"></font><i></i><br></div><div><font face=3D"courier new=
,monospace">// generates</font></div><div><font face=3D"courier new,monospa=
ce"></font><br></div><div><div style=3D"background-color: transparent; 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; color: rgb(34, 34, 34); font-family: &quot;Arial&=
amp;quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-s=
tyle: normal; font-variant: normal; font-weight: 400; letter-spacing: norma=
l; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px=
; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; p=
adding-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-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;">void fwdfunc(int& && arg)=C2=A0</font></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: &quot;Arial&quot;,&quot;Helv=
etica&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;"><fo=
nt face=3D"courier new,monospace" 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;">{ =
=C2=A0</font></div><div style=3D"background-color: transparent; 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: &quot;Arial&quo=
t;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: n=
ormal; font-variant: normal; font-weight: 400; letter-spacing: normal; marg=
in-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orpha=
ns: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-=
top: 0px; text-align: left; text-decoration: none; text-indent: 0px; text-t=
ransform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-s=
pacing: 0px;"><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-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-ri=
ght-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-w=
idth: 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;">=C2=A0 func(std::forward<<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;">int&</span>>(arg));=C2=A0</font></div><div 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: 13px; font-variant: normal; font-weight: 4=
00; text-decoration: none; word-spacing: 0px; white-space: normal; orphans:=
2; -webkit-text-stroke-width: 0px; background-color: transparent;"><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;"><i>// =
=3D>=C2=A0 func(foo: <span style=3D"text-align: left; color: rgb(34, 34,=
34); text-transform: none; text-indent: 0px; letter-spacing: normal; font-=
size: 13px; 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;">std::forward<<span style=3D"text-align: left; color: rgb(34, 34, =
34); text-transform: none; text-indent: 0px; letter-spacing: normal; font-f=
amily: courier new,monospace; font-size: 13px; font-variant: normal; font-w=
eight: 400; text-decoration: none; word-spacing: 0px; display: inline !impo=
rtant; white-space: normal; orphans: 2; float: none; -webkit-text-stroke-wi=
dth: 0px; background-color: transparent;">int&</span>>(arg)</span>)<=
/i></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); te=
xt-transform: none; text-indent: 0px; letter-spacing: normal; font-size: 13=
px; font-variant: normal; font-weight: 400; text-decoration: none; word-spa=
cing: 0px; white-space: normal; orphans: 2; -webkit-text-stroke-width: 0px;=
background-color: transparent;"><font 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;=
"><font face=3D"courier new,monospace"><i>// =3D>=C2=A0 <span style=3D"t=
ext-align: left; color: rgb(34, 34, 34); text-transform: none; text-indent:=
0px; letter-spacing: normal; font-size: 13px; font-variant: normal; font-w=
eight: 400; text-decoration: none; word-spacing: 0px; display: inline !impo=
rtant; white-space: normal; orphans: 2; float: none; -webkit-text-stroke-wi=
dth: 0px; background-color: transparent;">func(foo: </span><span style=3D"m=
argin: 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; font-=
weight: 400; text-decoration: none; word-spacing: 0px; display: inline; whi=
te-space: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; =
background-color: transparent;">int&</span><span style=3D"text-align: l=
eft; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter=
-spacing: normal; font-size: 13px; 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; ba=
ckground-color: transparent;">)</span></i></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: &quot;Arial&quot;,&quot;Helvetica&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 face=3D"cour=
ier new,monospace" 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;">}</font></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: &quot;Arial&quot;,&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;"><font fac=
e=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-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;"><br></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: &quot;Arial&quot;,&quo=
t;Helvetica&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=
;"><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-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; 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;">If=
the forwarding function declares a name for that argument, the user specif=
ied name is checked against that name instead and <span style=3D"display: i=
nline !important; float: none; background-color: transparent; color: rgb(34=
, 34, 34); font-family: "Arial","Helvetica",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;">std::forward is called normally.=
</span></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: &quot;Arial&qu=
ot;,&quot;Helvetica&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"arial,sans-serif" style=3D"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; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top:=
0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-t=
op: 0px;"><span style=3D"display: inline !important; float: none; backgroun=
d-color: transparent; color: rgb(34, 34, 34); font-family: "Arial"=
;,"Helvetica",sans-serif; 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=
;"><br></span></font></div><div style=3D"background-color: transparent; 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; 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: norm=
al; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0p=
x; 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;"><font face=3D"arial,sans-serif" 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;"><span style=3D"display: inline !important; float: none; ba=
ckground-color: transparent; color: rgb(34, 34, 34); font-family: "Ari=
al","Helvetica",sans-serif; font-size: 13px; font-style: nor=
mal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphan=
s: 2; text-align: left; text-decoration: none; text-indent: 0px; text-trans=
form: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spaci=
ng: 0px;"><br></span></font></div><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: &quo=
t;Arial&quot;,&quot;Helvetica&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"arial,sans-serif" 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;"><span style=3D"display: inline !important; float: n=
one; background-color: transparent; color: rgb(34, 34, 34); font-family: &q=
uot;Arial","Helvetica",sans-serif; font-size: 13px; font-sty=
le: normal; font-variant: normal; font-weight: 400; letter-spacing: normal;=
orphans: 2; 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;">6. Calling a function with a name for an argument, but wit=
h no value for that argument, implies default value.</span></font></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: &quot;Arial&quot;,&quot;Helvetica=
&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"arial,sans-serif" style=3D"border-bottom-color: rgb(34, 34, 34); 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(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(3=
4, 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: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style=
=3D"display: inline !important; float: none; background-color: transparent;=
color: rgb(34, 34, 34); font-family: "Arial","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;"><br></span></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: &quot;Arial&quot;,&quot;=
Helvetica&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;"=
>This rule has two important applications.</div><div style=3D"background-co=
lor: transparent; 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: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; 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;"><br></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: &quot;Arial&quot;,&quot;Helvetica&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;">First it allows us to expli=
citly pass defaulted arguments.</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: &=
quot;Arial&quot;,&quot;Helvetica&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;"><br></div><font face=3D"courier new,monospa=
ce">func(int a, int b: b =3D 10. int c: c =3D -1, string text =3D "hel=
lo");</font></div><div><font face=3D"courier new,monospace"><br></font=
></div><div><font face=3D"courier new,monospace">func(10, b:, c:, "bye=
");</font></div><div><font face=3D"courier new,monospace"><br></font><=
/div><div><font face=3D"arial,sans-serif">Second, it enables using default =
arguments in environments where default arguments are <span style=3D"displa=
y: inline !important; float: none; background-color: transparent; color: rg=
b(34, 34, 34); font-family: arial,sans-serif; font-size: 13px; font-style: =
normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orp=
hans: 2; 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;">currently </span>considered bad practice.</font></div><div><fo=
nt face=3D"courier new,monospace"></font><br></div><div><font face=3D"couri=
er new,monospace">func(Somethings some, M magic: m =3D "goodMagic"=
;);</font></div><div><font face=3D"courier new,monospace"></font><font face=
=3D"courier new,monospace"></font><br></div><div><font face=3D"courier new,=
monospace">func(something, magic:); <i>//< clear, magic is involved</i><=
/font><br></div><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: &quot;Arial&q=
uot;,&quot;Helvetica&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 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;"><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-va=
riant: 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"></font><i></i><br></span></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: &quot;Arial&quot;,&quot;Helvetica&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 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;"><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; whi=
te-space: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; =
background-color: transparent;"><br></span></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: &quot;Arial&quot;,&quot;Helvetica&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;">7<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;">. Names do <i>not</i> contribute to overload resolu=
tion.</span></font></div><div style=3D"background-color: transparent; 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: &quot;Arial&a=
mp;quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-st=
yle: 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; pa=
dding-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); 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"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;"><br></sp=
an></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-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: &quot;Arial&quot;,=
&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: norm=
al; 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-tran=
sform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spac=
ing: 0px;"><font 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;"><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;">Argument names ar=
e not part of the type system and not part of the function name, they are l=
ast minute confirmation, a handshake, after all the details are resolved.=
=C2=A0</span></font></div><div style=3D"background-color: transparent; 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; color: rgb(34, 34, 34); font-family: &quot;Arial&=
amp;quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-s=
tyle: normal; font-variant: normal; font-weight: 400; letter-spacing: norma=
l; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px=
; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; p=
adding-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); 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;"><span styl=
e=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; fo=
nt-variant: normal; font-weight: 400; text-decoration: none; word-spacing: =
0px; display: inline !important; white-space: normal; orphans: 2; float: no=
ne; -webkit-text-stroke-width: 0px; background-color: transparent;"><br></s=
pan></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: &quot;Arial&quot;=
,&quot;Helvetica&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;"><span style=3D"display: inline !important; float: none; backgro=
und-color: transparent; color: rgb(34, 34, 34); font-family: "Arial&qu=
ot;,"Helvetica",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;"><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;">=
<font face=3D""Arial","Helvetica",sans-serif"></font>Th=
is way we don't complicate=C2=A0</font><span style=3D"display: inline !=
important; float: none; background-color: transparent; color: rgb(34, 34, 3=
4); font-family: "Arial","Helvetica",sans-serif; 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;"><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; 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;">overload resolution further </font>and <fo=
nt 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-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;">prevent =
wrongly remembered, and/or wrongly typed, names to pick the incorrect overl=
oad or to fail finding an overload at all.</font></span></span></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: &quot;Arial&quot;,&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;"><span style=
=3D"display: inline !important; float: none; background-color: transparent;=
color: rgb(34, 34, 34); font-family: "Arial","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;"><span style=3D"dis=
play: inline !important; float: none; background-color: transparent; color:=
rgb(34, 34, 34); font-family: "Arial","Helvetica",sans=
-serif; 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;"><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-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;">Letting names "guide"=
; or "early out" overloading means making them stronger or equal =
to types which is unsound, considering they are optional and not part of th=
e name/signature or the function.</font></span></span></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: &quot;Arial&quot;,&quot;Helvetica&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"arial,=
sans-serif" 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;"><span style=3D"display: i=
nline !important; float: none; background-color: transparent; color: rgb(34=
, 34, 34); font-family: "Arial","Helvetica",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;"><span style=3D"display: inline !=
important; float: none; background-color: transparent; color: rgb(34, 34, 3=
4); font-family: "Arial","Helvetica",sans-serif; 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;"><br></span></span></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: &quot;Arial&quot;,&quot;Helvetica&=
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;">In other word=
s, the times names will help will eventually be countered by the times name=
s will get in the way, yet in the former case, changes to the overloading a=
re needed. That's a bad trade off.</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=
: &quot;Arial&quot;,&quot;Helvetica&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"arial,sans-serif" 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;"><span style=3D"display: inline !important=
; float: none; background-color: transparent; color: rgb(34, 34, 34); font-=
family: "Arial","Helvetica",sans-serif; font-size: 13px=
; font-style: normal; font-variant: normal; font-weight: 400; letter-spacin=
g: normal; orphans: 2; 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></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: &quot;Arial&quot;,&quot;Helvetica&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"arial,sans-seri=
f" 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;"><span style=3D"display: inline !im=
portant; float: none; background-color: transparent; color: rgb(34, 34, 34)=
; font-family: "Arial","Helvetica",sans-serif; 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;"><br></span></font></div><div style=3D"mar=
gin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-image: none; te=
xt-align: left; color: rgb(34, 34, 34); text-transform: none; text-indent: =
0px; letter-spacing: normal; font-size: 13px; font-variant: normal; word-sp=
acing: 0px; white-space: normal; orphans: 2; -webkit-text-stroke-width: 0px=
; background-color: transparent;"><font face=3D"arial,sans-serif" 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;"><span style=3D"text-align: left; color: rgb(34=
, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: normal; =
font-family: "Arial","Helvetica",sans-serif; font-size:=
13px; font-variant: normal; word-spacing: 0px; display: inline !important;=
white-space: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0=
px; background-color: transparent;"><span 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); display: inline; f=
loat: none; font-family: arial,sans-serif; font-size: 13px; font-style: nor=
mal; font-variant: normal; font-weight: 700; 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;">Part 4. What about the standard library?</span></span></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 face=3D"arial,=
sans-serif" 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;"><span style=3D"text-align=
: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px; let=
ter-spacing: normal; font-family: "Arial","Helvetica",s=
ans-serif; font-size: 13px; font-variant: normal; word-spacing: 0px; displa=
y: inline !important; white-space: normal; orphans: 2; float: none; -webkit=
-text-stroke-width: 0px; background-color: transparent;"><span 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=
); display: inline; float: none; font-family: arial,sans-serif; font-size: =
13px; font-style: normal; font-variant: normal; font-weight: 700; 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;"><br></span></span></font></div><div style=
=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-image: n=
one; text-align: left; color: rgb(34, 34, 34); text-transform: none; text-i=
ndent: 0px; letter-spacing: normal; font-size: 13px; font-variant: normal; =
word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-stroke-wid=
th: 0px; background-color: transparent;"><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;"><span style=3D"text-align: left; color:=
rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: n=
ormal; font-family: "Arial","Helvetica",sans-serif; fon=
t-size: 13px; font-variant: normal; word-spacing: 0px; display: inline !imp=
ortant; white-space: normal; orphans: 2; float: none; -webkit-text-stroke-w=
idth: 0px; background-color: transparent;"><span 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); display: in=
line; float: none; font-family: arial,sans-serif; font-size: 13px; font-sty=
le: normal; font-variant: normal; font-weight: 700; 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;"><br></span></span></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; let=
ter-spacing: normal; font-size: 13px; font-variant: normal; word-spacing: 0=
px; white-space: normal; orphans: 2; -webkit-text-stroke-width: 0px; backgr=
ound-color: transparent;"><font face=3D"arial,sans-serif">As said, the stan=
dard library as a whole does not really need named arguments, yet some impr=
ovements could be made.</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: n=
ormal; font-size: 13px; font-variant: normal; word-spacing: 0px; white-spac=
e: normal; orphans: 2; -webkit-text-stroke-width: 0px; background-color: tr=
ansparent;"><font face=3D"arial,sans-serif">Some interfaces could be<span s=
tyle=3D"display: inline !important; float: none; background-color: transpar=
ent; color: rgb(34, 34, 34); font-family: arial,sans-serif; font-size: 13px=
; font-style: normal; font-variant: normal; font-weight: 400; letter-spacin=
g: normal; orphans: 2; text-align: left; text-decoration: none; text-indent=
: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: n=
ormal; word-spacing: 0px;"> streamlined and some -</span> made more clear. =
=C2=A0</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: normal; font-size:=
13px; font-variant: normal; word-spacing: 0px; white-space: normal; orphan=
s: 2; -webkit-text-stroke-width: 0px; background-color: transparent;"><font=
face=3D"arial,sans-serif"><br></font></div><div style=3D"margin: 0px; padd=
ing: 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-sp=
acing: normal; font-size: 13px; font-variant: normal; word-spacing: 0px; wh=
ite-space: normal; orphans: 2; -webkit-text-stroke-width: 0px; background-c=
olor: transparent;"><font face=3D"arial,sans-serif">For example the _n vers=
ions for most algorithms introduce this new function name not because the f=
unction does something different, but <span style=3D"display: inline !impor=
tant; float: none; background-color: transparent; color: rgb(34, 34, 34); f=
ont-family: arial,sans-serif; 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;">onl=
y to make the calls more clear</span>.</font></div><div 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: 13px; font-variant: normal; word-spacing: =
0px; white-space: normal; orphans: 2; -webkit-text-stroke-width: 0px; backg=
round-color: transparent;"><font face=3D"arial,sans-serif">This task could =
ideally be accomplished by a single named argument:</font></div><div style=
=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-image: n=
one; text-align: left; color: rgb(34, 34, 34); text-transform: none; text-i=
ndent: 0px; letter-spacing: normal; font-size: 13px; font-variant: normal; =
word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-stroke-wid=
th: 0px; background-color: transparent;"><font face=3D"arial,sans-serif"><b=
r></font></div><font face=3D"courier new,monospace">void fill( OutputIt fir=
st, Size count: count, const T& value );</font></div><div><font face=3D=
"courier new,monospace"><br></font></div><div><font face=3D"arial,sans-seri=
f">With this interface the user is free to name the, probably confusing, ar=
gument</font></div><div><br></div><div><font face=3D"courier new,monospace"=
>fill(begin, 5, -1); <i>//< confusing (but correct - all fill()-s are un=
der the same name)</i></font></div><div><span style=3D"display: inline !imp=
ortant; 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; orphans: 2; =
text-align: left; text-decoration: none; text-indent: 0px; text-transform: =
none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0p=
x;">fill(begin, count: 5, -1); <i>//< clear</i></span><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;">fill(begin, count, -1); <i>//< also =
clear, without unneeded over-specifications</i></span></div><div><br></div>=
<div>Even more interesting is the case with <font face=3D"courier new,monos=
pace">search_n.</font><font face=3D"arial,sans-serif"> Few things make this=
interesting.=C2=A0</font></div><div><font face=3D"arial,sans-serif">First =
is the fact, that although it ends with _n, yet this indicates something co=
mpletely different then with all other algorithms.</font></div><div><font f=
ace=3D"arial,sans-serif">The suffix does not indicate the count of items to=
operate on, but the count of consecutive values, <span style=3D"display: i=
nline !important; float: none; background-color: transparent; color: rgb(0,=
0, 0); font-family: DejaVuSans,"DejaVu Sans",arial,sans-serif; f=
ont-size: 12.8px; font-style: normal; font-variant: normal; font-weight: 40=
0; letter-spacing: normal; line-height: 15.36px; orphans: 2; text-align: le=
ft; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-=
text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">equal to t=
he 'value' argument.</span>=C2=A0</font></div><div><font face=3D"ar=
ial,sans-serif"><br></font></div><div>Second, the suffix does not help maki=
ng the call more clear, not to the slightest, but what is more interesting =
-<i> making the arguments names public, does not make things any more clear=
either!</i><br></div><div>What we need instead is, actually to do a design=
work on a argument name, or couple of argument names, in order to make the=
interface clear and understandable.=C2=A0</div><div><br></div><div>Here ar=
e few suggestions to highlight the possibilities=C2=A0</div><div><br></div>=
<div><font face=3D"courier new,monospace">FrwIt search( FrwIt first, FrwIt =
last, Size encounters: count, const T& ofValue: value );=C2=A0</font><f=
ont face=3D"courier new,monospace"><br></font></div><font face=3D"courier n=
ew,monospace"><div>FrwIt search( FrwIt first, FrwIt last, Size consecutiveI=
tems: count, const T& <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: n=
ormal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: le=
ft; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-=
text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">equalTo</s=
pan>: value );=C2=A0<br></div></font><div><font face=3D"courier new,monospa=
ce">FrwIt search( FrwIt first, FrwIt last, const T& forValue: value, Si=
ze repeated: count );</font></div><div><font face=3D"courier new,monospace"=
><br></font></div><div><font face=3D"courier new,monospace">// use</font></=
div><div><font face=3D"courier new,monospace"><br></font></div><div><font f=
ace=3D"courier new,monospace"><div style=3D"margin: 0px; padding: 0px; bord=
er: 0px rgb(34, 34, 34); border-image: none; text-align: left; color: rgb(3=
4, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: normal;=
font-family: courier new,monospace; font-size: 13px; font-variant: normal;=
word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-stroke-wi=
dth: 0px; background-color: transparent;"><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;">search(begin, end, encounters: 5, ofValue: 0);</span><br 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-family: courier new,monospace; font-size: 13px; height: auto; margin-bot=
tom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: =
0px; overflow: visible; overflow-x: visible; overflow-y: visible; padding-b=
ottom: 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; 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; col=
or: 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; 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;">search(begin, end, <span 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); display: =
inline; float: none; font-family: courier new,monospace; 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;">consecutiveItems</span>: 5, <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;">equalTo</span>: 0);<br></div></font></di=
v><div><font face=3D"courier new,monospace">search(begin, end, forValue: 0,=
repeated: 5);</font></div><div><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;"></sp=
an><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike></div><div><=
br></div><div>This shows clearly, named arguments have <i>no alternative</i=
> when it comes to expressiveness. It also shows the importance of them bei=
ng optional, as well as being separate from the argument.<br></div><div><br=
></div><div>Let's see some more examples where using named arguments ma=
ke the code notably more clear</div><div><br></div><div><font face=3D"couri=
er new,monospace">create_directory("path/to/directory", attribute=
sFrom: <span style=3D"text-align: left; color: rgb(34, 34, 34); text-transf=
orm: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-=
style: normal; font-variant: normal; font-weight: 400; text-decoration: non=
e; word-spacing: 0px; display: inline !important; white-space: normal; orph=
ans: 2; float: none; -webkit-text-stroke-width: 0px; background-color: tran=
sparent;">"path/to/file"</span>);</font></div><div><font face=3D"=
courier new,monospace"></font><font face=3D"courier new,monospace"><br></fo=
nt></div><font face=3D"courier new,monospace">nth_element(begin, partitionP=
oint: (end - begin)*.33, end);<br>replace(begin, end, 5, with: 1);<br></fon=
t><div><font face=3D"courier new,monospace">sample(begin, end, begin1, samp=
les: 1000, gen);</font></div><div><br></div><div></div><font face=3D"courie=
r new,monospace">copysign(2, from: -1 );=C2=A0</font><br><div><font face=3D=
"courier new,monospace">assoc_laguerre(n: 1, m: 10, x: 0.5);</font></div><f=
ont face=3D"courier new,monospace"> sph_legendre(n: 3, m: 0, theta: 1.2345)=
;</font><div><font face=3D"courier new,monospace">ellint_1(k: 0, phi: acos(=
-1)/2</font>);</div><div><font face=3D"courier new,monospace"><font face=3D=
""Arial","Helvetica",sans-serif"></font><br></font></di=
v><div><font face=3D"arial,sans-serif">It bears repeating, names are optio=
nal - the user is free to use them only where he considers, there is a need=
for them.</font></div><div><font face=3D"arial,sans-serif"><br></font></di=
v><div><font face=3D"arial,sans-serif"><br></font></div><div><font face=3D"=
arial,sans-serif"><span style=3D"display: inline !important; float: none; b=
ackground-color: transparent; color: rgb(34, 34, 34); font-family: arial,sa=
ns-serif; font-size: 13px; font-style: normal; font-variant: normal; font-w=
eight: 700; 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;">Part 5. What makes this=
different the other named arguments proposals?</span></font><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"><br></font></div><div><f=
ont face=3D"arial,sans-serif">1. Argue, names need to different from the ar=
gument they represent, <i>most of the time</i>, not by exception.</font></d=
iv><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">2.=
Argue, no API needs all arguments named. Names must have targeted, careful=
ly designed use. This includes the standard library.</font></div><div><font=
face=3D"arial,sans-serif"><br></font></div><div><font face=3D"arial,sans-s=
erif">For example, there is an overarching convention in the=C2=A0<span sty=
le=3D"display: inline !important; float: none; background-color: transparen=
t; 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: nor=
mal; word-spacing: 0px;">standard library,</span> that algorithms take an i=
nput range as the first two arguments. These don't need to be named. So=
me algorithms, which write the result to a new location, take an output ite=
rator as a third argument. This argument should be named, but it is not ess=
ential. And then, there is the regex library, which takes output as the fir=
st argument. This argument really should be named as it breaks any previous=
conventions.</font></div><div><font face=3D"arial,sans-serif"><br></font><=
/div><div><font face=3D"arial,sans-serif"><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;">regex_replace(out: begin1, begin, end, vowel, "*");</span><=
/font></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 face=3D"arial=
,sans-serif">This way the code is both self-documenting and more resilient =
to calling the incorrect overload.</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"arial,sans-serif">3. Argue, "forwarding" =
of names is doable without involving the type system.</font></div><div><fon=
t 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">4. Argue, not =
contributing to the overload resolution is a good thing.=C2=A0</font></div>=
<div><font face=3D"arial,sans-serif"><br></font></div><div><font face=3D"ar=
ial,sans-serif"><br></font></div><div><font face=3D"arial,sans-serif"><span=
style=3D"display: inline !important; float: none; background-color: transp=
arent; color: rgb(34, 34, 34); font-family: arial,sans-serif; font-size: 13=
px; font-style: normal; font-variant: normal; font-weight: 700; letter-spac=
ing: normal; orphans: 2; text-align: left; text-decoration: none; text-inde=
nt: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space:=
normal; word-spacing: 0px;">Conclusion</span><b></b><i></i><u></u><sub></s=
ub><sup></sup><strike></strike><br></font></div><div><font face=3D"arial,sa=
ns-serif"><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br><=
/font></div><div><font face=3D"arial,sans-serif">Contrary to the common per=
ception, named arguments are actually an enabling technology - they enable =
interfaces, impractical or even dangerous otherwise.=C2=A0</font></div><div=
><font face=3D"arial,sans-serif">When used for constructors they promote im=
mutability and minimalistic public interface. </font><font face=3D"arial,sa=
ns-serif">For regular functions, they promote natural function naming - wha=
t the function does - and natural number of arguments, not limited by reada=
bility. They lower maintenance cost and code size by eliminating superficia=
l constructs, used to work around lack of named arguments.</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">Thank You=
for Your time!</font></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/98f60883-3cd6-42a3-b3d6-ca67d0ac60e5%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/98f60883-3cd6-42a3-b3d6-ca67d0ac60e5=
%40isocpp.org</a>.<br />
------=_Part_11454_481106392.1532977105638--
------=_Part_11453_2124905378.1532977105635--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Mon, 30 Jul 2018 13:28:34 -0700 (PDT)
Raw View
------=_Part_11400_1062044968.1532982514117
Content-Type: multipart/alternative;
boundary="----=_Part_11401_2068532607.1532982514118"
------=_Part_11401_2068532607.1532982514118
Content-Type: text/plain; charset="UTF-8"
So, you're basically proposing P0671: Self-explanatory Function Arguments.
<http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2018/p0671r2.html> The
core principle of both is that it has no *behavioral* impact. You can't
overload off of it, you can't change the meaning of the code. It's just
notation to help the compiler give warnings, and for programmers to clarify
what's going on in complex situations.
There are differences. P0671 takes the parameter name as the name of the
argument, while yours creates a new syntax to declare such names. That
deals with one of the standard library problems, in that implementations
aren't required to give function parameters any particular name. Many
implementations will use `_Capital` names for such parameters, to avoid
conflicts with user-defined macros and such.
Of course, your way still breaks with user-defined macros too, but there's
nothing to be done about that. The real thing however is that modules ought
to be able to get around this. In a modular world, we can declare that the
standard library imported through modules *must* use the names specified in
the standard.
If that is done, then the principle reason for declaring parameters with
names goes away. There are still other reasons, such as having the freedom
to change them later. But since P0671 makes a mismatch merely a diagnostic
rather than ill-formed code, there isn't such a need for it.
Also, your proposal allows defaulting parameters in the middle of a
parameter sequence. I think this goes against the feature being pure
notation, as it allows you to do something you otherwise couldn't do. Not
to mention, it offers an incentive to give parameters names *regardless* of
whether it's genuinely useful to do so, just so that people can not pass
such parameters.
I consider your item #3.5 to be pure QoI. If an implementation wants to
peer through a template instantiation to discover where a parameter is
being forwarded to, it can, and it can issue a warning based on what it
finds. But there should be no requirement for 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/e9581a6c-a176-4cb1-a745-f3e3618146f5%40isocpp.org.
------=_Part_11401_2068532607.1532982514118
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div><font face=3D"arial,sans-serif">So, you're basica=
lly proposing <a href=3D"http://www.open-std.org/JTC1/SC22/WG21/docs/papers=
/2018/p0671r2.html">P0671: Self-explanatory Function Arguments.</a> The cor=
e principle of both is that it has no <i>behavioral</i> impact. You can'=
;t overload off of it, you can't change the meaning of the code. It'=
;s just notation to help the compiler give warnings, a</font>nd for program=
mers to clarify what's going on in complex situations.</div><div><br></=
div><div><div><font face=3D"arial,sans-serif">There are differences. P0671 =
takes=20
the parameter name as the name of the argument, while yours creates a=20
new syntax to declare such names. That deals with one of the standard libra=
ry problems, in that implementations aren't required to give function p=
arameters any particular name. Many implementations will use `_Capital` nam=
es for such parameters, to avoid conflicts with user-defined macros and suc=
h.</font></div><div><font face=3D"arial,sans-serif"><br></font></div><div><=
font face=3D"arial,sans-serif"></font></div><div><font face=3D"arial,sans-s=
erif">Of course, your way still breaks with user-defined macros too, but th=
ere's nothing to be done about that. The real thing however is that mod=
ules ought to be able to get around this. In a modular world, we can declar=
e that the standard library imported through modules <i>must</i> use the na=
mes specified in the standard.</font></div><div><font face=3D"arial,sans-se=
rif"><br></font></div><div><font face=3D"arial,sans-serif">If that is done,=
then the principle reason for declaring parameters with names goes away. T=
here are still other reasons, such as having the freedom to change them lat=
er. But since P0671 makes a mismatch merely a diagnostic rather than ill-fo=
rmed code, there isn't such a need for it.<br></font></div><div><font f=
ace=3D"arial,sans-serif"><br></font></div><div><font face=3D"arial,sans-ser=
if">Also, your proposal allows defaulting parameters
in the middle of a parameter sequence. I think this goes against the featu=
re being pure notation, as it allows you to do something you otherwise coul=
dn't do. Not to mention, it offers an incentive to give parameters name=
s <i>regardless</i> of whether it's genuinely useful to do so, just so =
that people can not pass such parameters.<br></font></div><div><font face=
=3D"arial,sans-serif"><br></font></div>I consider your item #3.5 to be pure=
QoI. If an implementation wants to peer through a template instantiation t=
o discover where a parameter is being forwarded to, it can, and it can issu=
e a warning based on what it finds. But there should be no requirement for =
it.<br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/e9581a6c-a176-4cb1-a745-f3e3618146f5%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/e9581a6c-a176-4cb1-a745-f3e3618146f5=
%40isocpp.org</a>.<br />
------=_Part_11401_2068532607.1532982514118--
------=_Part_11400_1062044968.1532982514117--
.
Author: Jake Arkinstall <jake.arkinstall@gmail.com>
Date: Tue, 31 Jul 2018 01:21:39 +0100
Raw View
--0000000000006c234e05724090f7
Content-Type: text/plain; charset="UTF-8"
Being pedantic, I contest your very first point, on the grounds that better
typing would make all of your examples a compilation error if the wrong
call is made. Phantom types are often used to combat this exact problem,
bringing a lot of beautiful algebraic type structure along for free.
In this sense, an angle and a distance certainly aren't equivalent
(regardless of their underlying representation), and a height and width
aren't the same thing but can be converted explicitly. For the child, a
mother and father can be cast to distinct types at the call site, and an
incorrect order would be a compile error.
This isn't to say that I don't see some purpose in named arguments, but I
just can't think of any example where the arguments are truly semantically
equivalent and the ordering isn't self-evident (as is the case with
symmetric and anti-symmetric functions, the latter by convention).
I'm sure there *are* probably some cases where named arguments solve a
problem that aren't already solved via sensible types, but some more
creative examples might be in order.
--
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/CAC%2B0CCN940DJPugkZ5-yuwtAQbJ1XYQ9rKh2WJ5-vcQ0fZLReQ%40mail.gmail.com.
--0000000000006c234e05724090f7
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"auto"><div dir=3D"auto"><span style=3D"font-family:sans-serif">=
Being pedantic, I contest your very first point, on the grounds that better=
typing would make all of your examples a compilation error if the wrong ca=
ll is made. Phantom types are often used to combat this exact problem, brin=
ging a lot of beautiful algebraic type structure along for free.</span></di=
v><div dir=3D"auto"><span style=3D"font-family:sans-serif"><br></span></div=
><div dir=3D"auto"><span style=3D"font-family:sans-serif">In this sense, an=
angle and a distance certainly aren't equivalent (regardless of their =
underlying representation), and a height and width aren't the same thin=
g but can be converted explicitly. For the child, a mother and father can b=
e cast to distinct types at the call site, and an incorrect order would be =
a compile error.</span><span style=3D"font-family:sans-serif"><br></span></=
div><div dir=3D"auto"><span style=3D"font-family:sans-serif"><br></span></d=
iv><div dir=3D"auto"><span style=3D"font-family:sans-serif">This isn't =
to say that I don't see some purpose in named arguments, but I just can=
't think of any example where the arguments are truly semantically equi=
valent and the ordering isn't self-evident (as is the case with symmetr=
ic and anti-symmetric functions, the latter by convention).</span></div><di=
v dir=3D"auto"><span style=3D"font-family:sans-serif"><br></span></div><div=
dir=3D"auto"><span style=3D"font-family:sans-serif">I'm sure there <i>=
are</i> probably some cases where named arguments solve a problem that aren=
't already solved via sensible types, but some more creative examples m=
ight be in order.</span></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAC%2B0CCN940DJPugkZ5-yuwtAQbJ1XYQ9rK=
h2WJ5-vcQ0fZLReQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAC%2B0CCN940DJ=
PugkZ5-yuwtAQbJ1XYQ9rKh2WJ5-vcQ0fZLReQ%40mail.gmail.com</a>.<br />
--0000000000006c234e05724090f7--
.
Author: florian.csdt@gmail.com
Date: Tue, 31 Jul 2018 02:09:50 -0700 (PDT)
Raw View
------=_Part_11499_1865634810.1533028190665
Content-Type: multipart/alternative;
boundary="----=_Part_11500_2134098942.1533028190665"
------=_Part_11500_2134098942.1533028190665
Content-Type: text/plain; charset="UTF-8"
I have the impression your new proposals are more and more complicated
without any real benefit.
In fact, I think your very first proposal on named argument was both
simpler and better.
Even though, I would say it was still a bit complex and could be simplified
further to solve some of the issues you had back then.
--
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/8081941b-4545-4b98-8efb-edcdb6446483%40isocpp.org.
------=_Part_11500_2134098942.1533028190665
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">I have the impression your new proposals are more and more=
complicated without any real benefit.<br>In fact, I think your very first =
proposal on named argument was both simpler and better.<br><br>Even though,=
I would say it was still a bit complex and could be simplified further to =
solve some of the issues you had back then.<br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/8081941b-4545-4b98-8efb-edcdb6446483%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/8081941b-4545-4b98-8efb-edcdb6446483=
%40isocpp.org</a>.<br />
------=_Part_11500_2134098942.1533028190665--
------=_Part_11499_1865634810.1533028190665--
.
Author: mihailnajdenov@gmail.com
Date: Wed, 1 Aug 2018 15:02:28 -0700 (PDT)
Raw View
------=_Part_128_501957959.1533160948545
Content-Type: multipart/alternative;
boundary="----=_Part_129_1986583514.1533160948547"
------=_Part_129_1986583514.1533160948547
Content-Type: text/plain; charset="UTF-8"
Nicol, the most important difference is the fact, names are different from
arguments - this *radically* improves the expressiveness of names (names
like 'equalTo', 'with', 'including', 'forValue' become feasible) and frees
the library developer to use and change the arguments at any time.
Also, wrong names are errors, not a warnings.
About forwarding, we formerly must handle the case as the implementation
must know against which call to check the name. I see forwarding as pretty
much a must, considering we want to make_objects and constructors are
number one client of named arguments.
Jake, typing does not scale and come at maintenance and code size cost (why
is the stl not using different types for x and theta?).
More importantly, at some point special types no longer make semantic sense
- width and height are not different because it is perfectly normal to
size.setWidth(size.height()).
Mother and Father are different, but MotherName does not make sense. If we
invent types that are useless beyond a function call - we have a problem
with the function call itself.
But there is more, how do you make typed arguments *optionally* typed? Do
you really want to affect overloading, function points, etc. just to get
naming?
And how to you name types for count, n, k, theta, phi, for, excluding,
partitionPoint etc, etc.
Of course, types come first, but sometimes even different types need to be
annotated - setData(data, forKey: myObject); nextEvent(Mask, until: Date)
Most often however this comes up in non-public interfaces, the ones that
are not as pretty and minimalistic.
It is not unheard of to have a class to take few different types upon
creation, and these classes to have no self-evident relation to the created
class .
And because this is not a public interface one will never going to make
pretty wrapper-classes for the call site - one almost certainly will use
comments, or worse.
And not just class creation, functions as well - often different types does
not make things any more less confusing and we are forced to have long,
explanatory names to the function itself and/or comments.
florian, not sure which one you have in mind. If it was the one with tag
arguments
<https://groups.google.com/a/isocpp.org/d/msg/std-proposals/tPtdQE2GXb0/4OjT5Z4pBQAJ>,
it is not an alternative at all - both complement each other.
And, honestly, I don't think this one is complex -
- arguments can have a second name, the user can pass that second name.
- it is an error to have name mismatch.
- names are declared by the same rules as default value.
- the compiler passes the name on forward(), if not already "caught" by
the enclosing call.
- (optional) the user can omit the value, if a name is specified and
there is a default value.
- (tiny optional) if no argument is specified, only name, the name
becomes the argument.
That is literally 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/d378c4ce-c5e6-4555-ba0e-4d5b4fa176f8%40isocpp.org.
------=_Part_129_1986583514.1533160948547
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><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: &quot;Arial&quot;=
,&quot;Helvetica&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;">Nicol, the most important difference is the fact, names are dif=
ferent from arguments - this <i style=3D"background-attachment: scroll; bac=
kground-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-size: auto; 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: &quot;Arial&=
quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; height: au=
to; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0p=
x; min-width: 0px; overflow: visible; overflow-x: visible; overflow-y: visi=
ble; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-to=
p: 0px;">radically</i> improves the expressiveness of names (names like =
9;equalTo', 'with', 'including', 'forValue'=C2=
=A0 become feasible) and frees the library developer to use and change the =
arguments at any time.</div><div style=3D"background-color: transparent; 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: &quot;Aria=
l&quot;,&quot;Helvetica&quot;,sans-serif; 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;"><br style=3D"background-attachment: scroll; backgrou=
nd-clip: border-box; background-color: transparent; background-image: none;=
background-origin: padding-box; background-position-x: 0%; background-posi=
tion-y: 0%; background-repeat: repeat; background-size: auto; 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: &quot;Arial&quot;=
,&quot;Helvetica&quot;,sans-serif; font-size: 13px; height: auto; m=
argin-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: 0p=
x;"></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: &quot;Arial&quot;,&q=
uot;Helvetica&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;">Also, wrong names are errors, not a warnings.=C2=A0</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: &quot;Arial&quot;,&quot;Helvetica&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;">About forwarding, =
we formerly must handle the case as the implementation must know against wh=
ich call to check the name. I see forwarding as pretty much a must, conside=
ring we want to make_objects and constructors are number one client of name=
d arguments.<br></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: &quot;Arial&=
quot;,&quot;Helvetica&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: &quot;Arial&quot;,&=
quot;Helvetica&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><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: &quot;Arial&quot;,&quot;He=
lvetica&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;"><=
br style=3D"background-attachment: scroll; background-clip: border-box; bac=
kground-color: transparent; background-image: none; background-origin: padd=
ing-box; background-position-x: 0%; background-position-y: 0%; background-r=
epeat: 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-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; color: rgb(=
34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&=
;quot;,sans-serif; font-size: 13px; height: auto; margin-bottom: 0px; margi=
n-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: =
visible; overflow-x: visible; overflow-y: visible; padding-bottom: 0px; pad=
ding-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; 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: &quot;Arial&quot;,&quot;Helvetica&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;">Jake, typing does n=
ot scale and come at maintenance and code size cost (why is the stl not usi=
ng different types for x and theta?).=C2=A0</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: &quot;Arial&quot;,&quot;Helvetica&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></div><div 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); f=
ont-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-se=
rif; 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-decorat=
ion: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-widt=
h: 0px; white-space: normal; word-spacing: 0px;">More importantly, at some =
point special types no longer make semantic sense - width and height are no=
t different because it is perfectly normal to <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;">size.setWidth(size.height()).=
</font><font face=3D"arial,sans-serif" 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;=
">=C2=A0</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: &quot;Arial&q=
uot;,&quot;Helvetica&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"arial,sans-serif" 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;">Mother and Father are different, but MotherName does not make se=
nse. If we invent types that are useless beyond a function call - we have a=
problem with the function call itself.=C2=A0</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: &quot;Arial&quot;,&quot;Helvetica&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"arial,sa=
ns-serif" 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</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: &quot;Arial&quot;,&quot;Helvetica&=
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;">But there is =
more<font face=3D"arial,sans-serif" style=3D"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; 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;">,=
how do you make typed arguments <i style=3D"background-attachment: scroll;=
background-clip: border-box; background-color: transparent; background-ima=
ge: none; background-origin: padding-box; background-position-x: 0%; backgr=
ound-position-y: 0%; background-repeat: repeat; background-size: auto; 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; color: rgb(34, 34, 34); font-family: arial,sans-serif=
; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible; overflow=
-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; p=
adding-right: 0px; padding-top: 0px;">optionally</i> typed? Do you really w=
ant to affect overloading, function points, etc. just to get naming?</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: &quot;Arial&quot;,&quot;=
Helvetica&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;"=
>And how to you name types for <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;">count, n, k</font><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;">, theta, phi,<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-family: courier new,monospace;=
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;"> for, excluding, <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-family: courier new,monospace;=
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;">partitionPoint</span> <font fa=
ce=3D"arial,sans-serif" style=3D"border-bottom-color: rgb(34, 34, 34); 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(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(3=
4, 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: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">etc, etc.=C2=
=A0</font></span></font><br></div><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: &quo=
t;Arial&quot;,&quot;Helvetica&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"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-inde=
nt: 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: none; -webkit-te=
xt-stroke-width: 0px; background-color: transparent;"><br>Of course, types =
come first, but sometimes even different types </span><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-decoration: none; word-spacing: 0px; displ=
ay: inline; white-space: normal; orphans: 2; float: none; -webkit-text-stro=
ke-width: 0px; background-color: transparent;"><font 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;"><font 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;">need to be anno=
tated - </font></font><font face=3D"courier new,monospace"><font 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; 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;"><font 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;">set=
Data(data, forKey: myObject);</font></font><font 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;"><font style=3D"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; 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;"> nextEvent(Mask, un=
til: Date)</font></font></font></span></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: &quot;Arial&quot;,&quot;Helvetica&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;"><span style=3D"background-col=
or: transparent; 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; 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; 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 face=3D"arial,sans-serif" style=3D"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; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0p=
x; padding-top: 0px;"><br></font></span></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: &quot;Arial&quot;,&quot;Helvetica&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;"><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: courier new,monospace; 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"arial,sans-serif" 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;">Most often however this comes up in non-public inte=
rfaces, the ones that are not as pretty and minimalistic.=C2=A0</font></spa=
n></font></div><div style=3D"background-color: transparent; border-bottom-c=
olor: 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-ri=
ght-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-w=
idth: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&=
amp;quot;Helvetica&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: 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-trans=
form: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spaci=
ng: 0px;"><font face=3D"courier new,monospace" style=3D"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; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top:=
0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-t=
op: 0px;"><span style=3D"background-color: transparent; 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); display: inline; float: none; font-family: c=
ourier new,monospace; 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;"><font fac=
e=3D"arial,sans-serif" 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></font></s=
pan></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: &quot;Arial&quot;=
,&quot;Helvetica&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;"><font face=3D"courier new,monospace" 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;"><span 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); 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; 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"arial,sans-serif" 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;">It is not un=
heard of to have a class<span style=3D"display: inline !important; float: n=
one; background-color: transparent; color: rgb(34, 34, 34); font-family: ar=
ial,sans-serif; 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;"> to</span> take f=
ew different types upon creation, and these classes to have no self-evident=
relation to the created class .</font></span></font></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: &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; 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;"><font face=3D"courier=
new,monospace" style=3D"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; 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 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;"><font face=3D"arial,sans-serif" style=3D=
"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; 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;">And because this is not a public interface on=
e will never going to make pretty wrapper-classes for the call site - one a=
lmost certainly will use comments, or worse.=C2=A0</font></span></font></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: &quot;Arial&quot;,&quot;Helv=
etica&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;"><fo=
nt face=3D"courier new,monospace" 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"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); display: inline; float: none; font-family: courier new,mo=
nospace; 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"arial,sa=
ns-serif" 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;">And not just class creation=
, functions as well - often different types does not make things any more l=
ess confusing and we are forced to have long, explanatory names to the func=
tion itself and/or comments.=C2=A0</font></span></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; 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: &quot;Arial&quot;,&quot;Helvetica&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;"><font face=3D"couri=
er new,monospace" style=3D"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; 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 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;"><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; 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;"><br></font></span></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: &quot;Arial&quot;,&quot;Helvetica&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;"><span 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); display: inline; float: none; font-family: courier new,monospace; 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;"><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; =
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=
;"></font></span></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: &quot;Ar=
ial&quot;,&quot;Helvetica&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;"><span style=3D"background-color: transparent; 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; color: rgb(34, 34, 34); display: inline; float: none;=
font-family: courier new,monospace; font-size: 13px; font-style: normal; f=
ont-variant: normal; font-weight: 400; letter-spacing: normal; margin-botto=
m: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; 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;"><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-=
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;"=
>florian, not sure which one you have in mind. If it was the one with<a sty=
le=3D"border-bottom-color: rgb(17, 85, 204); 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(17, 85, 204); border-left-style: none; border-lef=
t-width: 0px; border-right-color: rgb(17, 85, 204); border-right-style: non=
e; border-right-width: 0px; border-top-color: rgb(17, 85, 204); border-top-=
style: none; border-top-width: 0px; color: rgb(17, 85, 204); cursor: text; =
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-decoration: none;" href=3D"https://groups.google.com/a/isocpp.org/d/=
msg/std-proposals/tPtdQE2GXb0/4OjT5Z4pBQAJ"> tag arguments</a>, it is not a=
n alternative at all - both complement each other.=C2=A0</font></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: &quot;Arial&quot;,&quo=
t;Helvetica&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=
;"><font face=3D"courier new,monospace" 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=
;"><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: courier =
new,monospace; font-size: 13px; font-style: normal; font-variant: normal; f=
ont-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0=
px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; pa=
dding-left: 0px; padding-right: 0px; padding-top: 0px; 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;"><font face=3D"ar=
ial,sans-serif" style=3D"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; 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;">And, honestly, I don&=
#39;t think this one is complex -=C2=A0</font></span></font></div><ul><li><=
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: &quot;Arial&quot;,&quot;Helveti=
ca&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"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-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;"><span =
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); display: inline; float: none; font-family: courier new,monos=
pace; 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"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-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;">arguments can have a second na=
me, </font></span></font><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;"><span style=3D"background-color: transparent; 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; color: rgb(34, 34, 34); display: inline; float: none;=
font-family: courier new,monospace; font-size: 13px; font-style: normal; f=
ont-variant: normal; font-weight: 400; letter-spacing: normal; margin-botto=
m: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; 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;"><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-=
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;"=
>the user can pass that second name.</font></span></font></div></li><li><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: &quot;Arial&quot;,&quot;Helvetica=
&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;"><span st=
yle=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-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; color: rgb(=
34, 34, 34); display: inline; float: none; font-family: courier new,monospa=
ce; 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"arial,sans-se=
rif" 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;">it is an error to have name mism=
atch.</font></span></font></div></li><li><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&quot;,&quot;Helvetica&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;"><span 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); display: inline; f=
loat: none; font-family: courier new,monospace; 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"arial,sans-serif" 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;">names are declared by the same rules as default value.</font></=
span></font></div></li><li><div style=3D"background-color: transparent; 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; 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: norm=
al; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0p=
x; 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;"><font face=3D"courier new,monospace" style=3D"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; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0p=
x; padding-top: 0px;"><span 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); display: inline; float: none; fo=
nt-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; 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=
;"><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-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; 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;">th=
e compiler passes the name on forward(), if not already "caught" =
by the enclosing call.</font></span></font></div></li><li><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: &quot;Arial&quot;,&quot;Helvetica&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;"><font face=3D"arial,sans-serif" 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;">(optional) the user can omit the value, if a n=
ame is specified and there is a default value.</font></span></font></div></=
li><li><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: &quot;Arial&quot;,&quot=
;Helvetica&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;=
"><span style=3D"background-color: transparent; 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); display: inline; float: none; font-family: courier n=
ew,monospace; font-size: 13px; font-style: normal; font-variant: normal; fo=
nt-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0p=
x; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; pad=
ding-left: 0px; padding-right: 0px; padding-top: 0px; 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;"><font face=3D"ari=
al,sans-serif" 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;">(tiny optional) if no =
argument is specified, only name, the name becomes the argument.<br></font>=
</span></font></div></li></ul><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: &quot;Ar=
ial&quot;,&quot;Helvetica&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;">That is literally it. =C2=A0=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" 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/d378c4ce-c5e6-4555-ba0e-4d5b4fa176f8%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/d378c4ce-c5e6-4555-ba0e-4d5b4fa176f8=
%40isocpp.org</a>.<br />
------=_Part_129_1986583514.1533160948547--
------=_Part_128_501957959.1533160948545--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Wed, 1 Aug 2018 17:46:32 -0700 (PDT)
Raw View
------=_Part_37_1659517818.1533170792302
Content-Type: multipart/alternative;
boundary="----=_Part_38_962052326.1533170792302"
------=_Part_38_962052326.1533170792302
Content-Type: text/plain; charset="UTF-8"
On Wednesday, August 1, 2018 at 6:02:28 PM UTC-4, mihailn...@gmail.com
wrote:
>
> Nicol, the most important difference is the fact, names are different from
> arguments - this *radically* improves the expressiveness of names (names
> like 'equalTo', 'with', 'including', 'forValue' become feasible) and frees
> the library developer to use and change the arguments at any time.
>
> Also, wrong names are errors, not a warnings.
> About forwarding, we formerly must handle the case as the implementation
> must know against which call to check the name. I see forwarding as pretty
> much a must, considering we want to make_objects and constructors are
> number one client of named arguments.
>
And that's exactly why it should be a warning, not an error. Because you're
not going to *always* be able to tell.
Let's say you have your own `make_` function, but it logs the arguments
with something like `(log(std::forward<Args>(args)), ...)` before calling
the constructor. That means you're going to forward each parameter to a
function. That function will be overloaded on each supported type to
extract the value for the logging operation (perhaps with some template
default). So... how does that work?
If you named an argument, and you have this rule that can look into the
function and see if it's calling the right function, what happens? It sees
that `log` doesn't take a named argument with that name, so it fails.
That's not good; you'd be breaking debugging information.
In fact, I just realized that `std::forward` *itself* wouldn't work, since
its argument does not have the corresponding name. So how can you call it
with a named parameter?
And if you special-case this as some magical property of `std::forward`...
what happens if people use the equivalent `static_cast`? Or is that
special-cased as well?
If this is going to work, you need to lay down *exactly* what the rules are
for this forwarding of named parameters.
--
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/9cac146c-47e5-40d1-8156-9137efd83dfc%40isocpp.org.
------=_Part_38_962052326.1533170792302
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Wednesday, August 1, 2018 at 6:02:28 PM UTC-4, mihailn.=
...@gmail.com 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"><div>Nicol, the most important difference is the fact, names are diff=
erent from arguments - this <i>radically</i> improves the expressiveness of=
names (names like 'equalTo', 'with', 'including', =
'forValue'=C2=A0 become feasible) and frees the library developer t=
o use and change the arguments at any time.</div><div><br></div><div>Also, =
wrong names are errors, not a warnings.=C2=A0</div><div>About forwarding, w=
e formerly must handle the case as the implementation must know against whi=
ch call to check the name. I see forwarding as pretty much a must, consider=
ing we want to make_objects and constructors are number one client of named=
arguments.<br></div></div></blockquote><div><br></div><div>And that's =
exactly why it should be a warning, not an error. Because you're not go=
ing to <i>always</i> be able to tell.</div><div><br></div><div>Let's sa=
y you have your own `make_` function, but it logs the arguments with someth=
ing like `(log(std::forward<Args>(args)), ...)` before calling the co=
nstructor. That means you're going to forward each parameter to a funct=
ion. That function will be overloaded on each supported type to extract the=
value for the logging operation (perhaps with some template default). So..=
.. how does that work?</div><div><br></div><div>If you named an argument, an=
d you have this rule that can look into the function and see if it's ca=
lling the right function, what happens? It sees that `log` doesn't take=
a named argument with that name, so it fails.</div><div><br></div><div>Tha=
t's not good; you'd be breaking debugging information.<br></div><di=
v><br></div><div>In fact, I just realized that `std::forward` <i>itself</i>=
wouldn't work, since its argument does not have the corresponding name=
.. So how can you call it with a named parameter?</div><div><br></div><div>A=
nd if you special-case this as some magical property of `std::forward`... w=
hat happens if people use the equivalent `static_cast`? Or is that special-=
cased as well?<br></div><div><br></div><div>If this is going to work, you n=
eed to lay down <i>exactly</i> what the rules are for this forwarding of na=
med parameters.</div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/9cac146c-47e5-40d1-8156-9137efd83dfc%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/9cac146c-47e5-40d1-8156-9137efd83dfc=
%40isocpp.org</a>.<br />
------=_Part_38_962052326.1533170792302--
------=_Part_37_1659517818.1533170792302--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Thu, 2 Aug 2018 03:53:11 +0300
Raw View
On 2 August 2018 at 03:46, Nicol Bolas <jmckesson@gmail.com> wrote:
> On Wednesday, August 1, 2018 at 6:02:28 PM UTC-4, mihailn...@gmail.com
> wrote:
>>
>> Nicol, the most important difference is the fact, names are different from
>> arguments - this radically improves the expressiveness of names (names like
>> 'equalTo', 'with', 'including', 'forValue' become feasible) and frees the
>> library developer to use and change the arguments at any time.
>>
>> Also, wrong names are errors, not a warnings.
>> About forwarding, we formerly must handle the case as the implementation
>> must know against which call to check the name. I see forwarding as pretty
>> much a must, considering we want to make_objects and constructors are number
>> one client of named arguments.
>
>
> And that's exactly why it should be a warning, not an error. Because you're
> not going to always be able to tell.
>
> Let's say you have your own `make_` function, but it logs the arguments with
> something like `(log(std::forward<Args>(args)), ...)` before calling the
> constructor. That means you're going to forward each parameter to a
> function. That function will be overloaded on each supported type to extract
> the value for the logging operation (perhaps with some template default).
> So... how does that work?
>
> If you named an argument, and you have this rule that can look into the
> function and see if it's calling the right function, what happens? It sees
> that `log` doesn't take a named argument with that name, so it fails.
>
> That's not good; you'd be breaking debugging information.
>
> In fact, I just realized that `std::forward` itself wouldn't work, since its
> argument does not have the corresponding name. So how can you call it with a
> named parameter?
>
> And if you special-case this as some magical property of `std::forward`...
> what happens if people use the equivalent `static_cast`? Or is that
> special-cased as well?
>
> If this is going to work, you need to lay down exactly what the rules are
> for this forwarding of named parameters.
Furthermore: does an ill-formed named-arg call SFINAE? If it does,
it's going to be a *really* hard sell
that to determine whether the call is or is not well formed, function
bodies should be inspected.
--
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/CAFk2RUYryg3HWekr8024_wbQGUCXZLoJ70FjPPh-BQnOF1Hneg%40mail.gmail.com.
.
Author: Florian Lemaitre <florian.csdt@gmail.com>
Date: Thu, 2 Aug 2018 12:49:16 +0200
Raw View
--0000000000000433c1057271908f
Content-Type: text/plain; charset="UTF-8"
2018-08-02 0:02 GMT+02:00 <mihailnajdenov@gmail.com>:
> florian, not sure which one you have in mind. If it was the one with tag
> arguments
> <https://groups.google.com/a/isocpp.org/d/msg/std-proposals/tPtdQE2GXb0/4OjT5Z4pBQAJ>,
> it is not an alternative at all - both complement each other.
> And, honestly, I don't think this one is complex -
>
> - arguments can have a second name, the user can pass that second name.
> - it is an error to have name mismatch.
> - names are declared by the same rules as default value.
> - the compiler passes the name on forward(), if not already "caught"
> by the enclosing call.
> - (optional) the user can omit the value, if a name is specified and
> there is a default value.
> - (tiny optional) if no argument is specified, only name, the name
> becomes the argument.
>
> That is literally it.
>
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.
The overload rules and forwarding rules are not affected as they are
applied after the aforementioned transformations.
ADL is not modified as the tag does not depend on the function namespace.
If a tag type already exist in the same TU, then it used (instead of
recreating another one).
If the tag is created in multiple TUs, the same rule applies as for regular
types: definitions must match (this is the compiler job).
If you mistype a tag, you get a hard error as there is no overload for it
(unless you have some catchall parameters...).
Tags wouldn't need any special treatment (apart from parsing).
This would just be syntactic sugar over well known behaviors: it would just
work.
The main feature here would be the automatic introduction of types. A bit
like a template instantiation. It is implicit.
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.
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/CANaF6iiMz883O7FdLiKbQ1RxfkcMJ-RwXK%2Bi4JEvKMs616VF5A%40mail.gmail.com.
--0000000000000433c1057271908f
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div class=3D"gmail_extra"><div class=3D"gmail_quote">2018=
-08-02 0:02 GMT+02:00 <span dir=3D"ltr"><<a href=3D"mailto:mihailnajden=
ov@gmail.com" target=3D"_blank">mihailnajdenov@gmail.com</a>></span>:<br=
><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1=
px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><font 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" face=
=3D"courier new,monospace"><span style=3D"background-color:transparent;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);display:inline;float:none;font-family:courier=
new,monospace;font-size:13px;font-style:normal;font-variant:normal;font-we=
ight:400;letter-spacing: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;text-align:left;text-decoration:none;text-indent:0px;text-=
transform:none;white-space:normal;word-spacing:0px"><font 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" face=3D=
"arial,sans-serif">florian, not sure which one you have in mind. If it was =
the one with<a style=3D"border-bottom-color:rgb(17,85,204);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(17,85,204);border-le=
ft-style:none;border-left-width:0px;border-right-color:rgb(17,85,204);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(17,85,204);b=
order-top-style:none;border-top-width:0px;color:rgb(17,85,204);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;text-decoration:none" href=
=3D"https://groups.google.com/a/isocpp.org/d/msg/std-proposals/tPtdQE2GXb0/=
4OjT5Z4pBQAJ" target=3D"_blank"> tag arguments</a>, it is not an alternativ=
e at all - both complement each other.=C2=A0</font></span></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,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;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" face=3D"courier new,monospace"><span style=3D"background-c=
olor: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-st=
yle:none;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);display:inline;float:non=
e;font-family:courier new,monospace;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"><f=
ont 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" face=3D"arial,sans-serif">And, honestly, I don't think th=
is one is complex -=C2=A0</font></span></font></div><ul><li><div><font 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" face=3D"courier new,monospace"><span style=3D"background-color:transp=
arent;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;color:rgb(34,34,34);display:inline;float:none;font-fami=
ly:courier new,monospace;font-size:13px;font-style:normal;font-variant:norm=
al;font-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;text-transform:none;white-space:normal;word-spacing:0px"><font 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" face=3D"arial,sans-serif">arguments can have a second name, </font></s=
pan></font><font style=3D"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;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" face=3D"courier new,monospace"><span style=3D"ba=
ckground-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-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);display:inline=
;float:none;font-family:courier new,monospace;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;padding-bottom:0px;pad=
ding-left:0px;padding-right:0px;padding-top:0px;text-align:left;text-decora=
tion:none;text-indent:0px;text-transform:none;white-space:normal;word-spaci=
ng:0px"><font style=3D"border-bottom-color:rgb(34,34,34);border-bottom-styl=
e: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-ri=
ght-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;marg=
in-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-rig=
ht:0px;padding-top:0px" face=3D"arial,sans-serif">the user can pass that se=
cond name.</font></span></font></div></li><li><div><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" face=3D"=
courier new,monospace"><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: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:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px;text-align:left;text-decoration:none;text-indent:0px;text-tran=
sform:none;white-space:normal;word-spacing:0px"><font 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" face=3D"ari=
al,sans-serif">it is an error to have name mismatch.</font></span></font></=
div></li><li><div><font 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;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" face=3D"courier new,monospace"><span styl=
e=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);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;color:rgb(34,34,34);display=
:inline;float:none;font-family:courier new,monospace;font-size:13px;font-st=
yle: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;padding-right:0px;padding-top:0px;text-align:left;text=
-decoration:none;text-indent:0px;text-transform:none;white-space:normal;wor=
d-spacing:0px"><font 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" face=3D"arial,sans-serif">names are declared=
by the same rules as default value.</font></span></font></div></li><li><di=
v><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-left-style:=
none;border-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);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" face=3D"courier new,monospace"><span style=3D"background-=
color:transparent;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;color:rgb(34,34,34);display:inline;float:no=
ne;font-family:courier new,monospace;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;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"><=
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" face=3D"arial,sans-serif">the compiler passes the name on fo=
rward(), if not already "caught" by the enclosing call.</font></s=
pan></font></div></li><li><div><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-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" face=3D"courier new,monospac=
e"><span style=3D"background-color:transparent;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;color:rgb(34,3=
4,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;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-al=
ign:left;text-decoration:none;text-indent:0px;text-transform:none;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-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" face=3D"arial,sans-serif">(opti=
onal) the user can omit the value, if a name is specified and there is a de=
fault value.</font></span></font></div></li><li><div><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-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;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" face=
=3D"courier new,monospace"><span style=3D"background-color:transparent;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);display:inline;float:none;font-family:courier=
new,monospace;font-size:13px;font-style:normal;font-variant:normal;font-we=
ight:400;letter-spacing: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;text-align:left;text-decoration:none;text-indent:0px;text-=
transform:none;white-space:normal;word-spacing:0px"><font 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" face=3D=
"arial,sans-serif">(tiny optional) if no argument is specified, only name, =
the name becomes the argument.<br></font></span></font></div></li></ul><div=
>That is literally it. =C2=A0=C2=A0</div></div></blockquote><div>=C2=A0</di=
v></div><div>I was thinking about this one: <a href=3D"https://groups.googl=
e.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I">https://groups.=
google.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I</a> <br></d=
iv><div><br></div><div>So let me tell you what I was thinking:</div><div><b=
r></div><div>There exist a common, yet unutterable, where tag types live (l=
ets call it tag_ns to simplify).</div><div><br></div><div>When you declare =
a function with tags:</div><div><div style=3D"background-color:rgb(250,250,=
250);border-color:rgb(187,187,187);border-style:solid;border-width:1px" cla=
ss=3D"gmail-prettyprint"><code class=3D"gmail-prettyprint"><div class=3D"gm=
ail-subprettyprint"><span style=3D"color:rgb(0,0,136)" class=3D"gmail-style=
d-by-prettify">int</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-st=
yled-by-prettify"> foo</span><span style=3D"color:rgb(102,102,0)" class=3D"=
gmail-styled-by-prettify">(</span><span style=3D"color:rgb(0,0,0)" class=3D=
"gmail-styled-by-prettify">tag_name</span><span style=3D"color:rgb(102,102,=
0)" class=3D"gmail-styled-by-prettify">:</span><span style=3D"color:rgb(0,0=
,0)" class=3D"gmail-styled-by-prettify"> </span><span style=3D"color:rgb(0,=
0,136)" class=3D"gmail-styled-by-prettify">float</span><span style=3D"color=
:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"> f</span><span style=3D"col=
or:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">);</span><span style=
=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"><br></span></div><=
/code></div>The compiler creates a tag type in this namespace called tag_na=
me, and transform the declaration like that:</div><div><div style=3D"backgr=
ound-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:soli=
d;border-width:1px" class=3D"gmail-prettyprint"><code class=3D"gmail-pretty=
print"><div class=3D"gmail-subprettyprint"><span style=3D"color:rgb(0,0,136=
)" class=3D"gmail-styled-by-prettify">int</span><span style=3D"color:rgb(0,=
0,0)" class=3D"gmail-styled-by-prettify"> foo</span><span style=3D"color:rg=
b(102,102,0)" class=3D"gmail-styled-by-prettify">(</span><span style=3D"col=
or:rgb(0,0,0)" class=3D"gmail-styled-by-prettify">tag_ns</span><span style=
=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">::</span><span=
style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify">tag_name</sp=
an><span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">=
,</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"=
> </span><span style=3D"color:rgb(0,0,136)" class=3D"gmail-styled-by-pretti=
fy">float</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-p=
rettify"> f</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-style=
d-by-prettify">);</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-sty=
led-by-prettify"><br></span></div></code></div></div><div><br></div><div>Wh=
en you call a function with a tag:</div><div><div style=3D"background-color=
:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border-w=
idth:1px" class=3D"gmail-prettyprint"><code class=3D"gmail-prettyprint"><di=
v class=3D"gmail-subprettyprint"><span style=3D"color:rgb(0,0,0)" class=3D"=
gmail-styled-by-prettify">foo</span><span style=3D"color:rgb(102,102,0)" cl=
ass=3D"gmail-styled-by-prettify">(</span><span style=3D"color:rgb(0,0,0)" c=
lass=3D"gmail-styled-by-prettify">tag_name</span><span style=3D"color:rgb(1=
02,102,0)" class=3D"gmail-styled-by-prettify">:</span><span style=3D"color:=
rgb(0,0,0)" class=3D"gmail-styled-by-prettify"> </span><span style=3D"color=
:rgb(0,102,102)" class=3D"gmail-styled-by-prettify">1.f</span><span style=
=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">);</span><span=
style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"><br></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-color:rgb(187,187,187);border-style:solid;border-width:=
1px" class=3D"gmail-prettyprint"><code class=3D"gmail-prettyprint"><div cla=
ss=3D"gmail-subprettyprint"><span style=3D"color:rgb(0,0,0)" class=3D"gmail=
-styled-by-prettify">foo</span><span style=3D"color:rgb(102,102,0)" class=
=3D"gmail-styled-by-prettify">(</span><span style=3D"color:rgb(0,0,0)" clas=
s=3D"gmail-styled-by-prettify">tag_ns</span><span style=3D"color:rgb(102,10=
2,0)" class=3D"gmail-styled-by-prettify">::</span><span style=3D"color:rgb(=
0,0,0)" class=3D"gmail-styled-by-prettify">tag_name</span><span style=3D"co=
lor:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">{},</span><span styl=
e=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"> </span><span sty=
le=3D"color:rgb(0,102,102)" class=3D"gmail-styled-by-prettify">1.f</span><s=
pan style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">);</s=
pan><span style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"><br=
></span></div></code></div><br>If two functions (even in different namespac=
es) use the same tag name, they will have the same tag type, which is fine.=
</div><div>The overload rules and forwarding rules are not affected as they=
are applied after the aforementioned transformations.</div><div>ADL is not=
modified as the tag does not depend on the function namespace.</div><div>I=
f a tag type already exist in the same TU, then it used (instead of recreat=
ing another one).</div><div>If
the tag is created in multiple TUs, the same rule applies as for=20
regular types: definitions must match (this is the compiler job).<br></div>=
<div><br></div><div>If you mistype a tag, you get a hard error as there is =
no overload for it (unless you have some catchall parameters...).</div><br>=
<div>Tags wouldn't need any special treatment (apart from parsing).<br>=
<div>This would just be syntactic sugar over well known behaviors: it would=
just work.</div><div><br></div><div>The main feature here would be the aut=
omatic introduction of types. A bit like a template instantiation. It is im=
plicit.<br></div><div><br></div><div>In your first proposal, you mentioned =
you wanted to be able to do something like that:</div><div><div style=3D"ba=
ckground-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:=
solid;border-width:1px" class=3D"gmail-prettyprint"><code class=3D"gmail-pr=
ettyprint"><div class=3D"gmail-subprettyprint"><span style=3D"color:rgb(0,0=
,0)" class=3D"gmail-styled-by-prettify">any</span><span style=3D"color:rgb(=
102,102,0)" class=3D"gmail-styled-by-prettify">(</span><span style=3D"color=
:rgb(0,0,0)" class=3D"gmail-styled-by-prettify">in_place</span><span style=
=3D"color:rgb(0,136,0)" class=3D"gmail-styled-by-prettify"><string></=
span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify=
">:</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettif=
y"> </span><span style=3D"color:rgb(0,136,0)" class=3D"gmail-styled-by-pret=
tify">""</span><span style=3D"color:rgb(102,102,0)" class=3D"gmai=
l-styled-by-prettify">);</span><span style=3D"color:rgb(0,0,0)" class=3D"gm=
ail-styled-by-prettify"><br></span></div></code></div>I don't think it =
is useful. you are not naming an argument here.</div><div><br></div><div>No=
w, to be fair, you could do something equivalent in C++20:</div><div><div s=
tyle=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);bor=
der-style:solid;border-width:1px" class=3D"gmail-prettyprint"><code class=
=3D"gmail-prettyprint"><div class=3D"gmail-subprettyprint"><span style=3D"c=
olor:rgb(0,0,136)" class=3D"gmail-styled-by-prettify">int</span><span style=
=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"> foo</span><span s=
tyle=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">(</span><s=
pan style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify">std</span=
><span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">::=
</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify">=
tag</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-pre=
ttify"><</span><span style=3D"color:rgb(0,136,0)" class=3D"gmail-styled-=
by-prettify">"tag_name"</span><span style=3D"color:rgb(102,102,0)=
" class=3D"gmail-styled-by-prettify">>,</span><span style=3D"color:rgb(0=
,0,0)" class=3D"gmail-styled-by-prettify"> </span><span style=3D"color:rgb(=
0,0,136)" class=3D"gmail-styled-by-prettify">float</span><span style=3D"col=
or:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"> f</span><span style=3D"c=
olor:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">);</span><span styl=
e=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"><br><br>foo</span=
><span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">(<=
/span><span style=3D"color:rgb(0,136,0)" class=3D"gmail-styled-by-prettify"=
>"tag_name"</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail=
-styled-by-prettify">tag</span><span style=3D"color:rgb(102,102,0)" class=
=3D"gmail-styled-by-prettify">,</span><span style=3D"color:rgb(0,0,0)" clas=
s=3D"gmail-styled-by-prettify"> </span><span style=3D"color:rgb(0,102,102)"=
class=3D"gmail-styled-by-prettify">1.f</span><span style=3D"color:rgb(102,=
102,0)" class=3D"gmail-styled-by-prettify">);</span><span style=3D"color:rg=
b(0,0,0)" class=3D"gmail-styled-by-prettify"><br></span></div></code></div>=
</div><div><br></div><div>But the shorthand syntax would be very nice.</div=
><div>Moreover, such a shorthand syntax would give people incentives to use=
it (I consider it a good thing).</div><div>Let's make a quick poll. Wh=
ich one do you prefer? (try to see it as a newcomer to the language)<br></d=
iv><div><div style=3D"background-color:rgb(250,250,250);border-color:rgb(18=
7,187,187);border-style:solid;border-width:1px" class=3D"gmail-prettyprint"=
><code class=3D"gmail-prettyprint"><div class=3D"gmail-subprettyprint"><spa=
n style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify">std</span><=
span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">::</=
span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify">fi=
nd_if</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-p=
rettify">(</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-=
prettify">v</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-style=
d-by-prettify">.</span><span style=3D"color:rgb(0,0,136)" class=3D"gmail-st=
yled-by-prettify">begin</span><span style=3D"color:rgb(102,102,0)" class=3D=
"gmail-styled-by-prettify">(),</span><span style=3D"color:rgb(0,0,0)" class=
=3D"gmail-styled-by-prettify"> v</span><span style=3D"color:rgb(102,102,0)"=
class=3D"gmail-styled-by-prettify">.</span><span style=3D"color:rgb(0,0,13=
6)" class=3D"gmail-styled-by-prettify">end</span><span style=3D"color:rgb(1=
02,102,0)" class=3D"gmail-styled-by-prettify">(),</span><span style=3D"colo=
r:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"> functor</span><span style=
=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">);</span><span=
style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"><br>std</spa=
n><span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">:=
:</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"=
>find</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-p=
rettify">(</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-=
prettify">v</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-style=
d-by-prettify">.</span><span style=3D"color:rgb(0,0,136)" class=3D"gmail-st=
yled-by-prettify">begin</span><span style=3D"color:rgb(102,102,0)" class=3D=
"gmail-styled-by-prettify">(),</span><span style=3D"color:rgb(0,0,0)" class=
=3D"gmail-styled-by-prettify"> v</span><span style=3D"color:rgb(102,102,0)"=
class=3D"gmail-styled-by-prettify">.</span><span style=3D"color:rgb(0,0,13=
6)" class=3D"gmail-styled-by-prettify">end</span><span style=3D"color:rgb(1=
02,102,0)" class=3D"gmail-styled-by-prettify">(),</span><span style=3D"colo=
r:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"> </span><span style=3D"col=
or:rgb(0,136,0)" class=3D"gmail-styled-by-prettify">"if"</span><s=
pan style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify">tag</span=
><span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">,<=
/span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"> =
functor</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by=
-prettify">);</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-=
by-prettify"><code class=3D"gmail-prettyprint"><span style=3D"color:rgb(0,0=
,0)" class=3D"gmail-styled-by-prettify"><br>std</span><span style=3D"color:=
rgb(102,102,0)" class=3D"gmail-styled-by-prettify">::</span><span style=3D"=
color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify">find</span><span style=
=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">(</span><span =
style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-prettify">v</span><span=
style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-prettify">.</span>=
<span style=3D"color:rgb(0,0,136)" class=3D"gmail-styled-by-prettify">begin=
</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-by-pretti=
fy">(),</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-styled-by-pre=
ttify"> v</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-styled-=
by-prettify">.</span><span style=3D"color:rgb(0,0,136)" class=3D"gmail-styl=
ed-by-prettify">end</span><span style=3D"color:rgb(102,102,0)" class=3D"gma=
il-styled-by-prettify">(),</span><span style=3D"color:rgb(0,0,0)" class=3D"=
gmail-styled-by-prettify"> </span><span style=3D"color:rgb(0,0,136)" class=
=3D"gmail-styled-by-prettify">if</span><span style=3D"color:rgb(102,102,0)"=
class=3D"gmail-styled-by-prettify">:</span><span style=3D"color:rgb(0,0,0)=
" class=3D"gmail-styled-by-prettify"> functor</span><span style=3D"color:rg=
b(102,102,0)" class=3D"gmail-styled-by-prettify">);</span><span style=3D"co=
lor:rgb(0,0,0)" class=3D"gmail-styled-by-prettify"><br></span></code></span=
></div></code></div><br>I personally prefer the third one (I would like it =
even more with ranges).</div><div>This is not really about the possibility =
to do it now, but how the syntax looks.<br></div><div><br></div><div>Overal=
l I want to clarify: that's my opinion, and I'm pretty sure some wi=
ll disagree, but I really think it is worth pursuing.</div></div>=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" 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/CANaF6iiMz883O7FdLiKbQ1RxfkcMJ-RwXK%2=
Bi4JEvKMs616VF5A%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CANaF6iiMz883O7=
FdLiKbQ1RxfkcMJ-RwXK%2Bi4JEvKMs616VF5A%40mail.gmail.com</a>.<br />
--0000000000000433c1057271908f--
.
Author: Henry Miller <hank@millerfarm.com>
Date: Thu, 02 Aug 2018 06:11:24 -0500
Raw View
This is a multi-part message in MIME format.
--_----------=_153320828420099392
Content-Type: text/plain; charset="UTF-8"
On Wed, Aug 1, 2018, at 7:46 PM, Nicol Bolas wrote:
> On Wednesday, August 1, 2018 at 6:02:28 PM UTC-4,
> mihailn...@gmail.com wrote:>> Nicol, the most important difference is the fact, names are different
>> from arguments - this *radically* improves the expressiveness of
>> names (names like 'equalTo', 'with', 'including', 'forValue' become
>> feasible) and frees the library developer to use and change the
>> arguments at any time.>>
>> Also, wrong names are errors, not a warnings.
>> About forwarding, we formerly must handle the case as the
>> implementation must know against which call to check the name. I see
>> forwarding as pretty much a must, considering we want to make_objects
>> and constructors are number one client of named arguments.>
> And that's exactly why it should be a warning, not an error. Because
> you're not going to *always* be able to tell.>
> Let's say you have your own `make_` function, but it logs the
> arguments with something like `(log(std::forward<Args>(args)), ...)`
> before calling the constructor. That means you're going to forward
> each parameter to a function. That function will be overloaded on each
> supported type to extract the value for the logging operation (perhaps
> with some template default). So... how does that work?>
> If you named an argument, and you have this rule that can look into
> the function and see if it's calling the right function, what
> happens? It sees that `log` doesn't take a named argument with that
> name, so it fails.>
> That's not good; you'd be breaking debugging information.
>
> In fact, I just realized that `std::forward` *itself* wouldn't work,
> since its argument does not have the corresponding name. So how can
> you call it with a named parameter?>
> And if you special-case this as some magical property of
> `std::forward`... what happens if people use the equivalent
> `static_cast`? Or is that special-cased as well?>
> If this is going to work, you need to lay down *exactly* what the
> rules are for this forwarding of named parameters.
While those are good points, I would rather the rule be error. If
that means named arguments are not compatible with std::forward or
other language constructs so be it. I would prefer the compiler tell
me that named arguments are illegal in some context than to have the
name ignored.
The problem with warning is we imply there are cases of false positives.
That destroys one of the reasons to name an argument.
DoSomething(height: 10) better not act on a width. If I can't use the
named argument in whatever context, at least I know to double check. If
I can use it, but sometimes I get a warning I'll ignore the warning (if
I wasn't going to ignore it I'd turn on warnings are errores) I've lost
the value of being sure that my name ensured correctness.
I might be okay with some syntax that indicates any name is acceptable
for some argument. Might because I have a suspicion I can't put into
words that ultimately it would be abused. In the context of log it makes
sense, but in the context of std::forward we can't cheat this way.
--
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/1533208284.2009939.1461035520.3BA93506%40webmail.messagingengine.com.
--_----------=_153320828420099392
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="UTF-8"
<!DOCTYPE html>
<html>
<head>
<title></title>
<style type=3D"text/css">p.MsoNormal,p.MsoNoSpacing{margin:0}</style>
</head>
<body><div style=3D"font-family:Arial;"><br></div>
<div><br></div>
<div><br></div>
<div>On Wed, Aug 1, 2018, at 7:46 PM, Nicol Bolas wrote:<br></div>
<blockquote type=3D"cite"><div dir=3D"ltr"><div style=3D"font-family:Arial;=
">On Wednesday, August 1, 2018 at 6:02:28 PM UTC-4, mihailn...@gmail.com wr=
ote:<br></div>
<blockquote defang_data-gmailquote=3D"yes" style=3D"margin-top:0px;margin-r=
ight:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-l=
eft-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;"><di=
v dir=3D"ltr"><div>Nicol, the most important difference is the fact, names =
are different from arguments - this <i>radically</i> improves the expressiv=
eness of names (names like 'equalTo', 'with', 'including', 'forValue' =
become feasible) and frees the library developer to use and change the arg=
uments at any time.<br></div>
<div><br></div>
<div>Also, wrong names are errors, not a warnings. <br></div>
<div>About forwarding, we formerly must handle the case as the implementati=
on must know against which call to check the name. I see forwarding as pret=
ty much a must, considering we want to make_objects and constructors are nu=
mber one client of named arguments.<br></div>
</div>
</blockquote><div><br></div>
<div>And that's exactly why it should be a warning, not an error. Because y=
ou're not going to <i>always</i> be able to tell.<br></div>
<div><br></div>
<div>Let's say you have your own `make_` function, but it logs the argument=
s with something like `(log(std::forward<Args>(args)), ...)` before c=
alling the constructor. That means you're going to forward each parameter t=
o a function. That function will be overloaded on each supported type to ex=
tract the value for the logging operation (perhaps with some template defau=
lt). So... how does that work?<br></div>
<div><br></div>
<div>If you named an argument, and you have this rule that can look into th=
e function and see if it's calling the right function, what happens? It see=
s that `log` doesn't take a named argument with that name, so it fails.<br>=
</div>
<div><br></div>
<div>That's not good; you'd be breaking debugging information.<br></div>
<div><br></div>
<div>In fact, I just realized that `std::forward` <i>itself</i> wouldn't wo=
rk, since its argument does not have the corresponding name. So how can you=
call it with a named parameter?<br></div>
<div><br></div>
<div>And if you special-case this as some magical property of `std::forward=
`... what happens if people use the equivalent `static_cast`? Or is that sp=
ecial-cased as well?<br></div>
<div><br></div>
<div>If this is going to work, you need to lay down <i>exactly</i> what the=
rules are for this forwarding of named parameters.<br></div>
</div>
</blockquote><div style=3D"font-family:Arial;"><br></div>
<div style=3D"font-family:Arial;">While those are good points, I would rath=
er the rule be error. If that means named arguments are not compatible with=
std::forward or other language constructs so be it. I would prefer the com=
piler tell me that named arguments are illegal in some context than to have=
the name ignored.<br></div>
<div style=3D"font-family:Arial;"><br></div>
<div style=3D"font-family:Arial;">The problem with warning is we imply ther=
e are cases of false positives. That destroys one of the reasons to name an=
argument. DoSomething(height: 10) better not act on a width. If I can't us=
e the named argument in whatever context, at least I know to double check. =
If I can use it, but sometimes I get a warning I'll ignore the warning (if =
I wasn't going to ignore it I'd turn on warnings are errores) I've lost the=
value of being sure that my name ensured correctness. </div>
<div style=3D"font-family:Arial;"><br></div>
<div style=3D"font-family:Arial;">I might be okay with some syntax that ind=
icates any name is acceptable for some argument. Might because I have a sus=
picion I can't put into words that ultimately it would be abused. In the co=
ntext of log it makes sense, but in the context of std::forward we can't ch=
eat this way.<br></div>
<div style=3D"font-family:Arial;"><br></div>
</body>
</html>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/1533208284.2009939.1461035520.3BA9350=
6%40webmail.messagingengine.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/1533208284.200993=
9.1461035520.3BA93506%40webmail.messagingengine.com</a>.<br />
--_----------=_153320828420099392--
.
Author: Richard Hodges <hodges.r@gmail.com>
Date: Thu, 2 Aug 2018 13:14:11 +0200
Raw View
--000000000000c9e8cb057271e9ed
Content-Type: text/plain; charset="UTF-8"
On Thu, 2 Aug 2018 at 12:49, Florian Lemaitre <florian.csdt@gmail.com>
wrote:
> 2018-08-02 0:02 GMT+02:00 <mihailnajdenov@gmail.com>:
>
>> florian, not sure which one you have in mind. If it was the one with tag
>> arguments
>> <https://groups.google.com/a/isocpp.org/d/msg/std-proposals/tPtdQE2GXb0/4OjT5Z4pBQAJ>,
>> it is not an alternative at all - both complement each other.
>> And, honestly, I don't think this one is complex -
>>
>> - arguments can have a second name, the user can pass that second
>> name.
>> - it is an error to have name mismatch.
>> - names are declared by the same rules as default value.
>> - the compiler passes the name on forward(), if not already "caught"
>> by the enclosing call.
>> - (optional) the user can omit the value, if a name is specified and
>> there is a default value.
>> - (tiny optional) if no argument is specified, only name, the name
>> becomes the argument.
>>
>> That is literally it.
>>
>
> 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.
> The overload rules and forwarding rules are not affected as they are
> applied after the aforementioned transformations.
> ADL is not modified as the tag does not depend on the function namespace.
> If a tag type already exist in the same TU, then it used (instead of
> recreating another one).
> If the tag is created in multiple TUs, the same rule applies as for
> regular types: definitions must match (this is the compiler job).
>
> If you mistype a tag, you get a hard error as there is no overload for it
> (unless you have some catchall parameters...).
>
> Tags wouldn't need any special treatment (apart from parsing).
> This would just be syntactic sugar over well known behaviors: it would
> just work.
>
> The main feature here would be the automatic introduction of types. A bit
> like a template instantiation. It is implicit.
>
> 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.
>
> 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.
>
I'm stating to see value in this approach. Basically it's automatic tagging.
FWIW I agree, the third looks the most favourable.
What would look even more favourable IMHO would be:
std::find(v.begin(), v.end(), if=functor)
I appreciate that this would require a little more context-sensitive syntax
parsing, but it's then as readable as python's named arguments.
Similarly, if we could declare defaults in the declaration in spite of
c++'s current limitation of only allowing defaults on the trailing
arguments, this would be great, no?
example:
auto bind_and_listen(socket: socket& sock,
iface: socket_interface_def = inet46_interface(0),
port: int port = 0,
backlog: int backlog = 5);
possible usages:
socket s;
bind_and_listen(s, port:1025); // listen on all interfaces on port 1025
with backlog 5
bind_and_listen(s, iface = ipv4(127,0,0,1), backlog=20); // listen on
localhost on auto-allocated port with backlog 20
bind_and_listen(s); // listen on all interfaces on auto-allocated port
with backlog 5
>
>
> --
> 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/CANaF6iiMz883O7FdLiKbQ1RxfkcMJ-RwXK%2Bi4JEvKMs616VF5A%40mail.gmail.com
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CANaF6iiMz883O7FdLiKbQ1RxfkcMJ-RwXK%2Bi4JEvKMs616VF5A%40mail.gmail.com?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/CALvx3hYjXwCn9RhMS9_7qrxpqhvtkUM48FOJfMGv%3DvuYVpVa6w%40mail.gmail.com.
--000000000000c9e8cb057271e9ed
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=
, 2 Aug 2018 at 12:49, Florian Lemaitre <<a href=3D"mailto:florian.csdt@=
gmail.com">florian.csdt@gmail.com</a>> wrote:<br></div><blockquote class=
=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padd=
ing-left:1ex"><div dir=3D"ltr"><div class=3D"gmail_extra"><div class=3D"gma=
il_quote">2018-08-02 0:02 GMT+02:00 <span dir=3D"ltr"><<a href=3D"mailt=
o:mihailnajdenov@gmail.com" target=3D"_blank">mihailnajdenov@gmail.com</a>&=
gt;</span>:<br><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><font 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" face=3D"courier new,monospace"><span style=3D"background-color:tra=
nsparent;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);display:inline;float:none;font-f=
amily:courier new,monospace;font-size:13px;font-style:normal;font-variant:n=
ormal;font-weight:400;letter-spacing: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;text-align:left;text-decoration:none;text-ind=
ent:0px;text-transform:none;white-space:normal;word-spacing:0px"><font 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" face=3D"arial,sans-serif">florian, not sure which one you have in min=
d. If it was the one with<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/d/msg/std-proposals=
/tPtdQE2GXb0/4OjT5Z4pBQAJ" target=3D"_blank"> tag arguments</a>, it is not =
an alternative at all - both complement each other.=C2=A0</font></span></fo=
nt></div><div><font 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;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" face=3D"courier new,monospace"><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:courier new,monospace;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;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;white-space:normal;word-sp=
acing:0px"><font style=3D"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;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" face=3D"arial,sans-serif">And, honestly, I don&#=
39;t think this one is complex -=C2=A0</font></span></font></div><ul><li><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" face=3D"courier new,monospace"><span style=3D"background=
-color:transparent;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;color:rgb(34,34,34);display:inline;float:n=
one;font-family:courier new,monospace;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;padding-bottom:0px;padding-lef=
t:0px;padding-right:0px;padding-top:0px;text-align:left;text-decoration:non=
e;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">=
<font style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;b=
order-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:no=
ne;border-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-sty=
le: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;p=
adding-top:0px" face=3D"arial,sans-serif">arguments can have a second name,=
</font></span></font><font 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" face=3D"courier new,monospace"><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:courier new,monospace;font-size:13px;fon=
t-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;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-align:left;=
text-decoration:none;text-indent:0px;text-transform:none;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-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" face=3D"arial,sans-serif">the user can p=
ass that second name.</font></span></font></div></li><li><div><font 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" face=3D"courier new,monospace"><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:courier new,monospace;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"><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=
" face=3D"arial,sans-serif">it is an error to have name mismatch.</font></s=
pan></font></div></li><li><div><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-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" face=3D"courier new,monospac=
e"><span style=3D"background-color:transparent;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;color:rgb(34,3=
4,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;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-al=
ign:left;text-decoration:none;text-indent:0px;text-transform:none;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-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" face=3D"arial,sans-serif">names=
are declared by the same rules as default value.</font></span></font></div=
></li><li><div><font 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" face=3D"courier new,monospace"><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 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;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" face=3D"arial,sans-serif">the compiler passes=
the name on forward(), if not already "caught" by the enclosing =
call.</font></span></font></div></li><li><div><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-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" face=3D"couri=
er new,monospace"><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:courier new,mono=
space;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"><font 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" face=3D"arial,sa=
ns-serif">(optional) the user can omit the value, if a name is specified an=
d there is a default value.</font></span></font></div></li><li><div><font 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" face=3D"courier new,monospace"><span style=3D"background-color:tra=
nsparent;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);display:inline;float:none;font-f=
amily:courier new,monospace;font-size:13px;font-style:normal;font-variant:n=
ormal;font-weight:400;letter-spacing: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;text-align:left;text-decoration:none;text-ind=
ent:0px;text-transform:none;white-space:normal;word-spacing:0px"><font 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" face=3D"arial,sans-serif">(tiny optional) if no argument is specified=
, only name, the name becomes the argument.<br></font></span></font></div><=
/li></ul><div>That is literally it. =C2=A0=C2=A0</div></div></blockquote><d=
iv>=C2=A0</div></div><div>I was thinking about this one: <a href=3D"https:/=
/groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I" ta=
rget=3D"_blank">https://groups.google.com/a/isocpp.org/forum/#!topic/std-pr=
oposals/O6rLutWGp4I</a> <br></div><div><br></div><div>So let me tell you wh=
at I was thinking:</div><div><br></div><div>There exist a common, yet unutt=
erable, where tag types live (lets call it tag_ns to simplify).</div><div><=
br></div><div>When you declare a function with tags:</div><div><div style=
=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-=
style:solid;border-width:1px" class=3D"m_2482495341028498929gmail-prettypri=
nt"><code class=3D"m_2482495341028498929gmail-prettyprint"><div class=3D"m_=
2482495341028498929gmail-subprettyprint"><span style=3D"color:rgb(0,0,136)"=
class=3D"m_2482495341028498929gmail-styled-by-prettify">int</span><span st=
yle=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-pret=
tify"> foo</span><span style=3D"color:rgb(102,102,0)" class=3D"m_2482495341=
028498929gmail-styled-by-prettify">(</span><span style=3D"color:rgb(0,0,0)"=
class=3D"m_2482495341028498929gmail-styled-by-prettify">tag_name</span><sp=
an style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-style=
d-by-prettify">:</span><span style=3D"color:rgb(0,0,0)" class=3D"m_24824953=
41028498929gmail-styled-by-prettify"> </span><span style=3D"color:rgb(0,0,1=
36)" class=3D"m_2482495341028498929gmail-styled-by-prettify">float</span><s=
pan style=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-b=
y-prettify"> f</span><span style=3D"color:rgb(102,102,0)" class=3D"m_248249=
5341028498929gmail-styled-by-prettify">);</span><span style=3D"color:rgb(0,=
0,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify"><br></span></=
div></code></div>The compiler creates a tag type in this namespace called t=
ag_name, and transform the declaration like that:</div><div><div style=3D"b=
ackground-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style=
:solid;border-width:1px" class=3D"m_2482495341028498929gmail-prettyprint"><=
code class=3D"m_2482495341028498929gmail-prettyprint"><div class=3D"m_24824=
95341028498929gmail-subprettyprint"><span style=3D"color:rgb(0,0,136)" clas=
s=3D"m_2482495341028498929gmail-styled-by-prettify">int</span><span style=
=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-prettif=
y"> foo</span><span style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028=
498929gmail-styled-by-prettify">(</span><span style=3D"color:rgb(0,0,0)" cl=
ass=3D"m_2482495341028498929gmail-styled-by-prettify">tag_ns</span><span st=
yle=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-styled-by-=
prettify">::</span><span style=3D"color:rgb(0,0,0)" class=3D"m_248249534102=
8498929gmail-styled-by-prettify">tag_name</span><span style=3D"color:rgb(10=
2,102,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify">,</span><=
span style=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-=
by-prettify"> </span><span style=3D"color:rgb(0,0,136)" class=3D"m_24824953=
41028498929gmail-styled-by-prettify">float</span><span style=3D"color:rgb(0=
,0,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify"> f</span><sp=
an style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-style=
d-by-prettify">);</span><span style=3D"color:rgb(0,0,0)" class=3D"m_2482495=
341028498929gmail-styled-by-prettify"><br></span></div></code></div></div><=
div><br></div><div>When you call a function with a tag:</div><div><div styl=
e=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);border=
-style:solid;border-width:1px" class=3D"m_2482495341028498929gmail-prettypr=
int"><code class=3D"m_2482495341028498929gmail-prettyprint"><div class=3D"m=
_2482495341028498929gmail-subprettyprint"><span style=3D"color:rgb(0,0,0)" =
class=3D"m_2482495341028498929gmail-styled-by-prettify">foo</span><span sty=
le=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-styled-by-p=
rettify">(</span><span style=3D"color:rgb(0,0,0)" class=3D"m_24824953410284=
98929gmail-styled-by-prettify">tag_name</span><span style=3D"color:rgb(102,=
102,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify">:</span><sp=
an style=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by=
-prettify"> </span><span style=3D"color:rgb(0,102,102)" class=3D"m_24824953=
41028498929gmail-styled-by-prettify">1.f</span><span style=3D"color:rgb(102=
,102,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify">);</span><=
span style=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-=
by-prettify"><br></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-color:rgb(187,187,187);border-style:solid;border-width:=
1px" class=3D"m_2482495341028498929gmail-prettyprint"><code class=3D"m_2482=
495341028498929gmail-prettyprint"><div class=3D"m_2482495341028498929gmail-=
subprettyprint"><span style=3D"color:rgb(0,0,0)" class=3D"m_248249534102849=
8929gmail-styled-by-prettify">foo</span><span style=3D"color:rgb(102,102,0)=
" class=3D"m_2482495341028498929gmail-styled-by-prettify">(</span><span sty=
le=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-prett=
ify">tag_ns</span><span style=3D"color:rgb(102,102,0)" class=3D"m_248249534=
1028498929gmail-styled-by-prettify">::</span><span style=3D"color:rgb(0,0,0=
)" class=3D"m_2482495341028498929gmail-styled-by-prettify">tag_name</span><=
span style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-sty=
led-by-prettify">{},</span><span style=3D"color:rgb(0,0,0)" class=3D"m_2482=
495341028498929gmail-styled-by-prettify"> </span><span style=3D"color:rgb(0=
,102,102)" class=3D"m_2482495341028498929gmail-styled-by-prettify">1.f</spa=
n><span style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-=
styled-by-prettify">);</span><span style=3D"color:rgb(0,0,0)" class=3D"m_24=
82495341028498929gmail-styled-by-prettify"><br></span></div></code></div><b=
r>If two functions (even in different namespaces) use the same tag name, th=
ey will have the same tag type, which is fine.</div><div>The overload rules=
and forwarding rules are not affected as they are applied after the aforem=
entioned transformations.</div><div>ADL is not modified as the tag does not=
depend on the function namespace.</div><div>If a tag type already exist in=
the same TU, then it used (instead of recreating another one).</div><div>I=
f
the tag is created in multiple TUs, the same rule applies as for=20
regular types: definitions must match (this is the compiler job).<br></div>=
<div><br></div><div>If you mistype a tag, you get a hard error as there is =
no overload for it (unless you have some catchall parameters...).</div><br>=
<div>Tags wouldn't need any special treatment (apart from parsing).<br>=
<div>This would just be syntactic sugar over well known behaviors: it would=
just work.</div><div><br></div><div>The main feature here would be the aut=
omatic introduction of types. A bit like a template instantiation. It is im=
plicit.<br></div><div><br></div><div>In your first proposal, you mentioned =
you wanted to be able to do something like that:</div><div><div style=3D"ba=
ckground-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:=
solid;border-width:1px" class=3D"m_2482495341028498929gmail-prettyprint"><c=
ode class=3D"m_2482495341028498929gmail-prettyprint"><div class=3D"m_248249=
5341028498929gmail-subprettyprint"><span style=3D"color:rgb(0,0,0)" class=
=3D"m_2482495341028498929gmail-styled-by-prettify">any</span><span style=3D=
"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-styled-by-pretti=
fy">(</span><span style=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929=
gmail-styled-by-prettify">in_place</span><span style=3D"color:rgb(0,136,0)"=
class=3D"m_2482495341028498929gmail-styled-by-prettify"><string></sp=
an><span style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail=
-styled-by-prettify">:</span><span style=3D"color:rgb(0,0,0)" class=3D"m_24=
82495341028498929gmail-styled-by-prettify"> </span><span style=3D"color:rgb=
(0,136,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify">"&q=
uot;</span><span style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498=
929gmail-styled-by-prettify">);</span><span style=3D"color:rgb(0,0,0)" clas=
s=3D"m_2482495341028498929gmail-styled-by-prettify"><br></span></div></code=
></div>I don't think it is useful. you are not naming an argument here.=
</div><div><br></div><div>Now, to be fair, you could do something equivalen=
t in C++20:</div><div><div style=3D"background-color:rgb(250,250,250);borde=
r-color:rgb(187,187,187);border-style:solid;border-width:1px" class=3D"m_24=
82495341028498929gmail-prettyprint"><code class=3D"m_2482495341028498929gma=
il-prettyprint"><div class=3D"m_2482495341028498929gmail-subprettyprint"><s=
pan style=3D"color:rgb(0,0,136)" class=3D"m_2482495341028498929gmail-styled=
-by-prettify">int</span><span style=3D"color:rgb(0,0,0)" class=3D"m_2482495=
341028498929gmail-styled-by-prettify"> foo</span><span style=3D"color:rgb(1=
02,102,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify">(</span>=
<span style=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled=
-by-prettify">std</span><span style=3D"color:rgb(102,102,0)" class=3D"m_248=
2495341028498929gmail-styled-by-prettify">::</span><span style=3D"color:rgb=
(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify">tag</span>=
<span style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-st=
yled-by-prettify"><</span><span style=3D"color:rgb(0,136,0)" class=3D"m_=
2482495341028498929gmail-styled-by-prettify">"tag_name"</span><sp=
an style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-style=
d-by-prettify">>,</span><span style=3D"color:rgb(0,0,0)" class=3D"m_2482=
495341028498929gmail-styled-by-prettify"> </span><span style=3D"color:rgb(0=
,0,136)" class=3D"m_2482495341028498929gmail-styled-by-prettify">float</spa=
n><span style=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styl=
ed-by-prettify"> f</span><span style=3D"color:rgb(102,102,0)" class=3D"m_24=
82495341028498929gmail-styled-by-prettify">);</span><span style=3D"color:rg=
b(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify"><br><br>f=
oo</span><span style=3D"color:rgb(102,102,0)" class=3D"m_248249534102849892=
9gmail-styled-by-prettify">(</span><span style=3D"color:rgb(0,136,0)" class=
=3D"m_2482495341028498929gmail-styled-by-prettify">"tag_name"</sp=
an><span style=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-sty=
led-by-prettify">tag</span><span style=3D"color:rgb(102,102,0)" class=3D"m_=
2482495341028498929gmail-styled-by-prettify">,</span><span style=3D"color:r=
gb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify"> </span>=
<span style=3D"color:rgb(0,102,102)" class=3D"m_2482495341028498929gmail-st=
yled-by-prettify">1.f</span><span style=3D"color:rgb(102,102,0)" class=3D"m=
_2482495341028498929gmail-styled-by-prettify">);</span><span style=3D"color=
:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify"><br></=
span></div></code></div></div><div><br></div><div>But the shorthand syntax =
would be very nice.</div><div>Moreover, such a shorthand syntax would give =
people incentives to use it (I consider it a good thing).</div><div>Let'=
;s make a quick poll. Which one do you prefer? (try to see it as a newcomer=
to the language)<br></div><div><div style=3D"background-color:rgb(250,250,=
250);border-color:rgb(187,187,187);border-style:solid;border-width:1px" cla=
ss=3D"m_2482495341028498929gmail-prettyprint"><code class=3D"m_248249534102=
8498929gmail-prettyprint"><div class=3D"m_2482495341028498929gmail-subprett=
yprint"><span style=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmai=
l-styled-by-prettify">std</span><span style=3D"color:rgb(102,102,0)" class=
=3D"m_2482495341028498929gmail-styled-by-prettify">::</span><span style=3D"=
color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify">f=
ind_if</span><span style=3D"color:rgb(102,102,0)" class=3D"m_24824953410284=
98929gmail-styled-by-prettify">(</span><span style=3D"color:rgb(0,0,0)" cla=
ss=3D"m_2482495341028498929gmail-styled-by-prettify">v</span><span style=3D=
"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-styled-by-pretti=
fy">.</span><span style=3D"color:rgb(0,0,136)" class=3D"m_24824953410284989=
29gmail-styled-by-prettify">begin</span><span style=3D"color:rgb(102,102,0)=
" class=3D"m_2482495341028498929gmail-styled-by-prettify">(),</span><span s=
tyle=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-pre=
ttify"> v</span><span style=3D"color:rgb(102,102,0)" class=3D"m_24824953410=
28498929gmail-styled-by-prettify">.</span><span style=3D"color:rgb(0,0,136)=
" class=3D"m_2482495341028498929gmail-styled-by-prettify">end</span><span s=
tyle=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-styled-by=
-prettify">(),</span><span style=3D"color:rgb(0,0,0)" class=3D"m_2482495341=
028498929gmail-styled-by-prettify"> functor</span><span style=3D"color:rgb(=
102,102,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify">);</spa=
n><span style=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styl=
ed-by-prettify"><br>std</span><span style=3D"color:rgb(102,102,0)" class=3D=
"m_2482495341028498929gmail-styled-by-prettify">::</span><span style=3D"col=
or:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify">find=
</span><span style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929g=
mail-styled-by-prettify">(</span><span style=3D"color:rgb(0,0,0)" class=3D"=
m_2482495341028498929gmail-styled-by-prettify">v</span><span style=3D"color=
:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify">.<=
/span><span style=3D"color:rgb(0,0,136)" class=3D"m_2482495341028498929gmai=
l-styled-by-prettify">begin</span><span style=3D"color:rgb(102,102,0)" clas=
s=3D"m_2482495341028498929gmail-styled-by-prettify">(),</span><span style=
=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-prettif=
y"> v</span><span style=3D"color:rgb(102,102,0)" class=3D"m_248249534102849=
8929gmail-styled-by-prettify">.</span><span style=3D"color:rgb(0,0,136)" cl=
ass=3D"m_2482495341028498929gmail-styled-by-prettify">end</span><span style=
=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-styled-by-pre=
ttify">(),</span><span style=3D"color:rgb(0,0,0)" class=3D"m_24824953410284=
98929gmail-styled-by-prettify"> </span><span style=3D"color:rgb(0,136,0)" c=
lass=3D"m_2482495341028498929gmail-styled-by-prettify">"if"</span=
><span style=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-style=
d-by-prettify">tag</span><span style=3D"color:rgb(102,102,0)" class=3D"m_24=
82495341028498929gmail-styled-by-prettify">,</span><span style=3D"color:rgb=
(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify"> functor</=
span><span style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gma=
il-styled-by-prettify">);</span><span style=3D"color:rgb(0,0,0)" class=3D"m=
_2482495341028498929gmail-styled-by-prettify"><code class=3D"m_248249534102=
8498929gmail-prettyprint"><span style=3D"color:rgb(0,0,0)" class=3D"m_24824=
95341028498929gmail-styled-by-prettify"><br>std</span><span style=3D"color:=
rgb(102,102,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify">::<=
/span><span style=3D"color:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-=
styled-by-prettify">find</span><span style=3D"color:rgb(102,102,0)" class=
=3D"m_2482495341028498929gmail-styled-by-prettify">(</span><span style=3D"c=
olor:rgb(0,0,0)" class=3D"m_2482495341028498929gmail-styled-by-prettify">v<=
/span><span style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gm=
ail-styled-by-prettify">.</span><span style=3D"color:rgb(0,0,136)" class=3D=
"m_2482495341028498929gmail-styled-by-prettify">begin</span><span style=3D"=
color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-styled-by-prettif=
y">(),</span><span style=3D"color:rgb(0,0,0)" class=3D"m_248249534102849892=
9gmail-styled-by-prettify"> v</span><span style=3D"color:rgb(102,102,0)" cl=
ass=3D"m_2482495341028498929gmail-styled-by-prettify">.</span><span style=
=3D"color:rgb(0,0,136)" class=3D"m_2482495341028498929gmail-styled-by-prett=
ify">end</span><span style=3D"color:rgb(102,102,0)" class=3D"m_248249534102=
8498929gmail-styled-by-prettify">(),</span><span style=3D"color:rgb(0,0,0)"=
class=3D"m_2482495341028498929gmail-styled-by-prettify"> </span><span styl=
e=3D"color:rgb(0,0,136)" class=3D"m_2482495341028498929gmail-styled-by-pret=
tify">if</span><span style=3D"color:rgb(102,102,0)" class=3D"m_248249534102=
8498929gmail-styled-by-prettify">:</span><span style=3D"color:rgb(0,0,0)" c=
lass=3D"m_2482495341028498929gmail-styled-by-prettify"> functor</span><span=
style=3D"color:rgb(102,102,0)" class=3D"m_2482495341028498929gmail-styled-=
by-prettify">);</span><span style=3D"color:rgb(0,0,0)" class=3D"m_248249534=
1028498929gmail-styled-by-prettify"><br></span></code></span></div></code><=
/div><br>I personally prefer the third one (I would like it even more with =
ranges).</div><div>This is not really about the possibility to do it now, b=
ut how the syntax looks.<br></div><div><br></div><div>Overall I want to cla=
rify: that's my opinion, and I'm pretty sure some will disagree, bu=
t I really think it is worth pursuing.</div></div></div></div></blockquote>=
<div><br></div><div>I'm stating to see value in this approach. Basicall=
y it's automatic tagging.</div><div><br></div><div>FWIW I agree, the th=
ird looks the most favourable.</div><div><br></div><div>What would look eve=
n more favourable IMHO would be:</div><div><br></div><div><span class=3D"gm=
ail-m_2482495341028498929gmail-styled-by-prettify" style=3D"color:rgb(0,0,0=
);font-family:monospace;font-size:small;background-color:rgb(250,250,250);t=
ext-decoration-style:initial;text-decoration-color:initial">std</span><span=
class=3D"gmail-m_2482495341028498929gmail-styled-by-prettify" style=3D"fon=
t-family:monospace;font-size:small;background-color:rgb(250,250,250);text-d=
ecoration-style:initial;text-decoration-color:initial;color:rgb(102,102,0)"=
>::</span><span class=3D"gmail-m_2482495341028498929gmail-styled-by-prettif=
y" style=3D"color:rgb(0,0,0);font-family:monospace;font-size:small;backgrou=
nd-color:rgb(250,250,250);text-decoration-style:initial;text-decoration-col=
or:initial">find</span><span class=3D"gmail-m_2482495341028498929gmail-styl=
ed-by-prettify" style=3D"font-family:monospace;font-size:small;background-c=
olor:rgb(250,250,250);text-decoration-style:initial;text-decoration-color:i=
nitial;color:rgb(102,102,0)">(</span><span class=3D"gmail-m_248249534102849=
8929gmail-styled-by-prettify" style=3D"color:rgb(0,0,0);font-family:monospa=
ce;font-size:small;background-color:rgb(250,250,250);text-decoration-style:=
initial;text-decoration-color:initial">v</span><span class=3D"gmail-m_24824=
95341028498929gmail-styled-by-prettify" style=3D"font-family:monospace;font=
-size:small;background-color:rgb(250,250,250);text-decoration-style:initial=
;text-decoration-color:initial;color:rgb(102,102,0)">.</span><span class=3D=
"gmail-m_2482495341028498929gmail-styled-by-prettify" style=3D"font-family:=
monospace;font-size:small;background-color:rgb(250,250,250);text-decoration=
-style:initial;text-decoration-color:initial;color:rgb(0,0,136)">begin</spa=
n><span class=3D"gmail-m_2482495341028498929gmail-styled-by-prettify" style=
=3D"font-family:monospace;font-size:small;background-color:rgb(250,250,250)=
;text-decoration-style:initial;text-decoration-color:initial;color:rgb(102,=
102,0)">(),</span><span class=3D"gmail-m_2482495341028498929gmail-styled-by=
-prettify" style=3D"color:rgb(0,0,0);font-family:monospace;font-size:small;=
background-color:rgb(250,250,250);text-decoration-style:initial;text-decora=
tion-color:initial"><span>=C2=A0</span>v</span><span class=3D"gmail-m_24824=
95341028498929gmail-styled-by-prettify" style=3D"font-family:monospace;font=
-size:small;background-color:rgb(250,250,250);text-decoration-style:initial=
;text-decoration-color:initial;color:rgb(102,102,0)">.</span><span class=3D=
"gmail-m_2482495341028498929gmail-styled-by-prettify" style=3D"font-family:=
monospace;font-size:small;background-color:rgb(250,250,250);text-decoration=
-style:initial;text-decoration-color:initial;color:rgb(0,0,136)">end</span>=
<span class=3D"gmail-m_2482495341028498929gmail-styled-by-prettify" style=
=3D"font-family:monospace;font-size:small;background-color:rgb(250,250,250)=
;text-decoration-style:initial;text-decoration-color:initial;color:rgb(102,=
102,0)">(),</span><span class=3D"gmail-m_2482495341028498929gmail-styled-by=
-prettify" style=3D"color:rgb(0,0,0);font-family:monospace;font-size:small;=
background-color:rgb(250,250,250);text-decoration-style:initial;text-decora=
tion-color:initial"><span>=C2=A0</span></span><span class=3D"gmail-m_248249=
5341028498929gmail-styled-by-prettify" style=3D"font-family:monospace;font-=
size:small;background-color:rgb(250,250,250);text-decoration-style:initial;=
text-decoration-color:initial;color:rgb(0,0,136)">if</span><span class=3D"g=
mail-m_2482495341028498929gmail-styled-by-prettify" style=3D"font-family:mo=
nospace;font-size:small;background-color:rgb(250,250,250);text-decoration-s=
tyle:initial;text-decoration-color:initial"><font color=3D"#666600">=3D</fo=
nt></span><span class=3D"gmail-m_2482495341028498929gmail-styled-by-prettif=
y" style=3D"color:rgb(0,0,0);font-family:monospace;font-size:small;backgrou=
nd-color:rgb(250,250,250);text-decoration-style:initial;text-decoration-col=
or:initial">functor</span><span class=3D"gmail-m_2482495341028498929gmail-s=
tyled-by-prettify" style=3D"font-family:monospace;font-size:small;backgroun=
d-color:rgb(250,250,250);text-decoration-style:initial;text-decoration-colo=
r:initial;color:rgb(102,102,0)">)</span><br></div><div><span class=3D"gmail=
-m_2482495341028498929gmail-styled-by-prettify" style=3D"font-family:monosp=
ace;font-size:small;background-color:rgb(250,250,250);text-decoration-style=
:initial;text-decoration-color:initial;color:rgb(102,102,0)"><br></span></d=
iv><div>I appreciate that this would require a little more context-sensitiv=
e syntax parsing, but it's then as readable as python's named argum=
ents.</div><div><br></div><div>Similarly, if we could declare defaults in t=
he declaration in spite of c++'s current limitation of only allowing de=
faults on the trailing arguments, this would be great, no?</div><div><br></=
div><div>example:</div><div><br></div><div><font face=3D"monospace, monospa=
ce">auto bind_and_listen(socket: socket& sock,=C2=A0</font></div><div><=
font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0iface: socket_interface_def =3D inet4=
6_interface(0),=C2=A0</font></div><div><font face=3D"monospace, monospace">=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0port: int port =3D 0,=C2=A0</font></div><div><font face=3D"monospace, mo=
nospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0backlog: int backlog =3D 5);</font></div><div><br></div><div>poss=
ible usages:</div><div><br></div><div><font face=3D"monospace, monospace">s=
ocket s;</font></div><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">bind_and_listen(s, port:1025);=C2=A0 /=
/ listen on all interfaces on port 1025 with backlog 5</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"><span style=3D"text-decoration-style:initial;text-decoration-color:initi=
al;float:none;display:inline">bind_and_listen(s, iface =3D ipv4(127,0,0,1),=
backlog=3D20);=C2=A0 // listen on localhost on auto-allocated port with ba=
cklog 20</span><br class=3D"gmail-Apple-interchange-newline"><span style=3D=
"text-decoration-style:initial;text-decoration-color:initial;float:none;dis=
play:inline">bind_and_listen(s);=C2=A0 // listen on all interfaces on auto-=
allocated port with backlog 5</span><br class=3D"gmail-Apple-interchange-ne=
wline"></font><br></div><br></div><div><br></div><div>=C2=A0</div><blockquo=
te class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc so=
lid;padding-left:1ex"><div dir=3D"ltr"><div class=3D"gmail_extra">=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" 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/CANaF6iiMz883O7FdLiKbQ1RxfkcMJ-RwXK%2=
Bi4JEvKMs616VF5A%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r" target=3D"_blank">https://groups.google.com/a/isocpp.org/d/msgid/std-pro=
posals/CANaF6iiMz883O7FdLiKbQ1RxfkcMJ-RwXK%2Bi4JEvKMs616VF5A%40mail.gmail.c=
om</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" 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/CALvx3hYjXwCn9RhMS9_7qrxpqhvtkUM48FOJ=
fMGv%3DvuYVpVa6w%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3hYjXwCn9R=
hMS9_7qrxpqhvtkUM48FOJfMGv%3DvuYVpVa6w%40mail.gmail.com</a>.<br />
--000000000000c9e8cb057271e9ed--
.
Author: florian.csdt@gmail.com
Date: Thu, 2 Aug 2018 04:39:03 -0700 (PDT)
Raw View
------=_Part_163_397881633.1533209943995
Content-Type: multipart/alternative;
boundary="----=_Part_164_1092868317.1533209943997"
------=_Part_164_1092868317.1533209943997
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Le jeudi 2 ao=C3=BBt 2018 13:14:24 UTC+2, Richard Hodges a =C3=A9crit :
>
>
>
> On Thu, 2 Aug 2018 at 12:49, Florian Lemaitre <floria...@gmail.com=20
> <javascript:>> wrote:
>
>> 2018-08-02 0:02 GMT+02:00 <mihailn...@gmail.com <javascript:>>:
>>
>>> florian, not sure which one you have in mind. If it was the one with=20
>>> tag arguments=20
>>> <https://groups.google.com/a/isocpp.org/d/msg/std-proposals/tPtdQE2GXb0=
/4OjT5Z4pBQAJ>,=20
>>> it is not an alternative at all - both complement each other.=20
>>> And, honestly, I don't think this one is complex -=20
>>>
>>> - arguments can have a second name, the user can pass that second=20
>>> name.
>>> - it is an error to have name mismatch.
>>> - names are declared by the same rules as default value.
>>> - the compiler passes the name on forward(), if not already "caught"=
=20
>>> by the enclosing call.
>>> - (optional) the user can omit the value, if a name is specified and=
=20
>>> there is a default value.
>>> - (tiny optional) if no argument is specified, only name, the name=
=20
>>> becomes the argument.
>>> =20
>>> That is literally it. =20
>>>
>> =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.
>> The overload rules and forwarding rules are not affected as they are=20
>> applied after the aforementioned transformations.
>> ADL is not modified as the tag does not depend on the function namespace=
..
>> If a tag type already exist in the same TU, then it used (instead of=20
>> recreating another one).
>> If the tag is created in multiple TUs, the same rule applies as for=20
>> regular types: definitions must match (this is the compiler job).
>>
>> If you mistype a tag, you get a hard error as there is no overload for i=
t=20
>> (unless you have some catchall parameters...).
>>
>> Tags wouldn't need any special treatment (apart from parsing).
>> This would just be syntactic sugar over well known behaviors: it would=
=20
>> just work.
>>
>> The main feature here would be the automatic introduction of types. A bi=
t=20
>> like a template instantiation. It is implicit.
>>
>> 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.
>>
>> 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.
>>
>
> I'm stating to see value in this approach. Basically it's automatic=20
> tagging.
>
> FWIW I agree, the third looks the most favourable.
>
> What would look even more favourable IMHO would be:
>
> std::find(v.begin(), v.end(), if=3Dfunctor)
>
> I appreciate that this would require a little more context-sensitive=20
> syntax parsing, but it's then as readable as python's named arguments.
>
Problem is: it would give ambiguous syntax:
int foo =3D 5;
bar(foo=3D3);
// bar(std::tag<"foo">{}, 3);
// or
// bar( (foo =3D 3) );
// ?
That's why I think the colon is the right choice.
=20
>
> Similarly, if we could declare defaults in the declaration in spite of=20
> c++'s current limitation of only allowing defaults on the trailing=20
> arguments, this would be great, no?
>
> example:
>
> auto bind_and_listen(socket: socket& sock,=20
> iface: socket_interface_def =3D inet46_interface(0),=
=20
> port: int port =3D 0,=20
> backlog: int backlog =3D 5);
>
> possible usages:
>
> socket s;
> bind_and_listen(s, port:1025); // listen on all interfaces on port 1025=
=20
> with backlog 5
> bind_and_listen(s, iface =3D ipv4(127,0,0,1), backlog=3D20); // listen o=
n=20
> localhost on auto-allocated port with backlog 20
> bind_and_listen(s); // listen on all interfaces on auto-allocated port=
=20
> with backlog 5
>
>
> For this, I would say you could do it in library:
template <class... Args>
struct PythonArgs : std::tuple<Args> {
PythonArgs(Args args) : std::tuple<Args>(std::forward<Args>(args)) {}
template <std::size_t I>
auto get(std::integral_constant<std::size_t, I> =3D {}) const; //=20
positional parameters
template <class T>
auto get(T) const; // keyword parameters
};
template <class... Args>
auto bind_and_listen(Args&&... args) {
PythonArgs pargs(std::forward<Args>(args)...);
auto socket =3D pargs.get(socket:);
auto port =3D pargs.get(port:);
/* ... */
}
That would be much easier to standardize, while still being powerful enough=
=20
for most cases.
--=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/316cd6ec-6266-4316-a676-e6bf557154f9%40isocpp.or=
g.
------=_Part_164_1092868317.1533209943997
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 13:14:24 UTC+2, Richard =
Hodges 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><div class=3D"gmail_quote"><div dir=3D"ltr">On Thu, 2 =
Aug 2018 at 12:49, Florian Lemaitre <<a href=3D"javascript:" target=3D"_=
blank" gdf-obfuscated-mailto=3D"jcKGfJgTDQAJ" rel=3D"nofollow" onmousedown=
=3D"this.href=3D'javascript:';return true;" onclick=3D"this.href=3D=
'javascript:';return true;">floria...@gmail.com</a>> wrote:<br><=
/div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-le=
ft:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div class=3D"gma=
il_quote">2018-08-02 0:02 GMT+02:00 <span dir=3D"ltr"><<a href=3D"javas=
cript:" target=3D"_blank" gdf-obfuscated-mailto=3D"jcKGfJgTDQAJ" rel=3D"nof=
ollow" onmousedown=3D"this.href=3D'javascript:';return true;" oncli=
ck=3D"this.href=3D'javascript:';return true;">mihailn...@gmail.com<=
/a>></span>:<br><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><fo=
nt 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" face=3D"courier new,monospace"><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:courier new,monospace;font-size:13px;font-style:normal;font-varia=
nt:normal;font-weight:400;letter-spacing: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;text-align:left;text-decoration:none;text=
-indent:0px;text-transform:none;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-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" face=3D"arial,sans-serif">florian, not sure which one you have in=
mind. If it was the one with<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);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-deco=
ration:none" href=3D"https://groups.google.com/a/isocpp.org/d/msg/std-propo=
sals/tPtdQE2GXb0/4OjT5Z4pBQAJ" target=3D"_blank" rel=3D"nofollow" onmousedo=
wn=3D"this.href=3D'https://groups.google.com/a/isocpp.org/d/msg/std-pro=
posals/tPtdQE2GXb0/4OjT5Z4pBQAJ';return true;" onclick=3D"this.href=3D&=
#39;https://groups.google.com/a/isocpp.org/d/msg/std-proposals/tPtdQE2GXb0/=
4OjT5Z4pBQAJ';return true;"> tag arguments</a>, it is not an alternativ=
e at all - both complement each other.=C2=A0</font></span></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,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;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" face=3D"courier new,monospace"><span style=3D"background-c=
olor: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-st=
yle:none;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);display:inline;float:non=
e;font-family:courier new,monospace;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"><f=
ont 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" face=3D"arial,sans-serif">And, honestly, I don't think th=
is one is complex -=C2=A0</font></span></font></div><ul><li><div><font 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" face=3D"courier new,monospace"><span style=3D"background-color:transp=
arent;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;color:rgb(34,34,34);display:inline;float:none;font-fami=
ly:courier new,monospace;font-size:13px;font-style:normal;font-variant:norm=
al;font-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;text-transform:none;white-space:normal;word-spacing:0px"><font 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" face=3D"arial,sans-serif">arguments can have a second name, </font></s=
pan></font><font style=3D"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;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" face=3D"courier new,monospace"><span style=3D"ba=
ckground-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-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);display:inline=
;float:none;font-family:courier new,monospace;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;padding-bottom:0px;pad=
ding-left:0px;padding-right:0px;padding-top:0px;text-align:left;text-decora=
tion:none;text-indent:0px;text-transform:none;white-space:normal;word-spaci=
ng:0px"><font style=3D"border-bottom-color:rgb(34,34,34);border-bottom-styl=
e: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-ri=
ght-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;marg=
in-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-rig=
ht:0px;padding-top:0px" face=3D"arial,sans-serif">the user can pass that se=
cond name.</font></span></font></div></li><li><div><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" face=3D"=
courier new,monospace"><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: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:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px;text-align:left;text-decoration:none;text-indent:0px;text-tran=
sform:none;white-space:normal;word-spacing:0px"><font 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" face=3D"ari=
al,sans-serif">it is an error to have name mismatch.</font></span></font></=
div></li><li><div><font 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;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" face=3D"courier new,monospace"><span styl=
e=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);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;color:rgb(34,34,34);display=
:inline;float:none;font-family:courier new,monospace;font-size:13px;font-st=
yle: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;padding-right:0px;padding-top:0px;text-align:left;text=
-decoration:none;text-indent:0px;text-transform:none;white-space:normal;wor=
d-spacing:0px"><font 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" face=3D"arial,sans-serif">names are declared=
by the same rules as default value.</font></span></font></div></li><li><di=
v><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-left-style:=
none;border-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);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" face=3D"courier new,monospace"><span style=3D"background-=
color:transparent;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;color:rgb(34,34,34);display:inline;float:no=
ne;font-family:courier new,monospace;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;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"><=
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" face=3D"arial,sans-serif">the compiler passes the name on fo=
rward(), if not already "caught" by the enclosing call.</font></s=
pan></font></div></li><li><div><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-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" face=3D"courier new,monospac=
e"><span style=3D"background-color:transparent;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;color:rgb(34,3=
4,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;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-al=
ign:left;text-decoration:none;text-indent:0px;text-transform:none;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-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" face=3D"arial,sans-serif">(opti=
onal) the user can omit the value, if a name is specified and there is a de=
fault value.</font></span></font></div></li><li><div><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-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;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" face=
=3D"courier new,monospace"><span style=3D"background-color:transparent;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);display:inline;float:none;font-family:courier=
new,monospace;font-size:13px;font-style:normal;font-variant:normal;font-we=
ight:400;letter-spacing: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;text-align:left;text-decoration:none;text-indent:0px;text-=
transform:none;white-space:normal;word-spacing:0px"><font 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" face=3D=
"arial,sans-serif">(tiny optional) if no argument is specified, only name, =
the name becomes the argument.<br></font></span></font></div></li></ul><div=
>That is literally it. =C2=A0=C2=A0</div></div></blockquote><div>=C2=A0</di=
v></div><div>I was thinking about this one: <a href=3D"https://groups.googl=
e.com/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I" target=3D"_blan=
k" rel=3D"nofollow" onmousedown=3D"this.href=3D'https://groups.google.c=
om/a/isocpp.org/forum/#!topic/std-proposals/O6rLutWGp4I';return true;" =
onclick=3D"this.href=3D'https://groups.google.com/a/isocpp.org/forum/#!=
topic/std-proposals/O6rLutWGp4I';return true;">https://groups.google.co=
m/a/<wbr>isocpp.org/forum/#!topic/std-<wbr>proposals/O6rLutWGp4I</a> <br></=
div><div><br></div><div>So let me tell you what I was thinking:</div><div><=
br></div><div>There exist a common, yet unutterable, where tag types live (=
lets call it tag_ns to simplify).</div><div><br></div><div>When you declare=
a function with tags:</div><div><div style=3D"background-color:rgb(250,250=
,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px"><c=
ode><div><span style=3D"color:rgb(0,0,136)">int</span><span style=3D"color:=
rgb(0,0,0)"> foo</span><span style=3D"color:rgb(102,102,0)">(</span><span s=
tyle=3D"color:rgb(0,0,0)">tag_name</span><span style=3D"color:rgb(102,102,0=
)">:</span><span style=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rg=
b(0,0,136)">float</span><span style=3D"color:rgb(0,0,0)"> f</span><span sty=
le=3D"color:rgb(102,102,0)">);</span><span style=3D"color:rgb(0,0,0)"><br><=
/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 st=
yle=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);bord=
er-style:solid;border-width:1px"><code><div><span style=3D"color:rgb(0,0,13=
6)">int</span><span style=3D"color:rgb(0,0,0)"> foo</span><span style=3D"co=
lor:rgb(102,102,0)">(</span><span style=3D"color:rgb(0,0,0)">tag_ns</span><=
span style=3D"color:rgb(102,102,0)">::</span><span style=3D"color:rgb(0,0,0=
)">tag_name</span><span style=3D"color:rgb(102,102,0)">,</span><span style=
=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(0,0,136)">float</spa=
n><span style=3D"color:rgb(0,0,0)"> f</span><span style=3D"color:rgb(102,10=
2,0)">);</span><span style=3D"color:rgb(0,0,0)"><br></span></div></code></d=
iv></div><div><br></div><div>When you call a function with a tag:</div><div=
><div style=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,1=
87);border-style:solid;border-width:1px"><code><div><span style=3D"color:rg=
b(0,0,0)">foo</span><span style=3D"color:rgb(102,102,0)">(</span><span styl=
e=3D"color:rgb(0,0,0)">tag_name</span><span style=3D"color:rgb(102,102,0)">=
:</span><span style=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(0=
,102,102)">1.f</span><span style=3D"color:rgb(102,102,0)">);</span><span st=
yle=3D"color:rgb(0,0,0)"><br></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-color:rgb(187,187,187);border-style:solid;border-width:=
1px"><code><div><span style=3D"color:rgb(0,0,0)">foo</span><span style=3D"c=
olor:rgb(102,102,0)">(</span><span style=3D"color:rgb(0,0,0)">tag_ns</span>=
<span style=3D"color:rgb(102,102,0)">::</span><span style=3D"color:rgb(0,0,=
0)">tag_name</span><span style=3D"color:rgb(102,102,0)">{},</span><span sty=
le=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(0,102,102)">1.f</s=
pan><span style=3D"color:rgb(102,102,0)">);</span><span style=3D"color:rgb(=
0,0,0)"><br></span></div></code></div><br>If two functions (even in differe=
nt namespaces) use the same tag name, they will have the same tag type, whi=
ch is fine.</div><div>The overload rules and forwarding rules are not affec=
ted as they are applied after the aforementioned transformations.</div><div=
>ADL is not modified as the tag does not depend on the function namespace.<=
/div><div>If a tag type already exist in the same TU, then it used (instead=
of recreating another one).</div><div>If
the tag is created in multiple TUs, the same rule applies as for=20
regular types: definitions must match (this is the compiler job).<br></div>=
<div><br></div><div>If you mistype a tag, you get a hard error as there is =
no overload for it (unless you have some catchall parameters...).</div><br>=
<div>Tags wouldn't need any special treatment (apart from parsing).<br>=
<div>This would just be syntactic sugar over well known behaviors: it would=
just work.</div><div><br></div><div>The main feature here would be the aut=
omatic introduction of types. A bit like a template instantiation. It is im=
plicit.<br></div><div><br></div><div>In your first proposal, you mentioned =
you wanted to be able to do something like that:</div><div><div style=3D"ba=
ckground-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:=
solid;border-width:1px"><code><div><span style=3D"color:rgb(0,0,0)">any</sp=
an><span style=3D"color:rgb(102,102,0)">(</span><span style=3D"color:rgb(0,=
0,0)">in_place</span><span style=3D"color:rgb(0,136,0)"><string></spa=
n><span style=3D"color:rgb(102,102,0)">:</span><span style=3D"color:rgb(0,0=
,0)"> </span><span style=3D"color:rgb(0,136,0)">""</span><span st=
yle=3D"color:rgb(102,102,0)">);</span><span style=3D"color:rgb(0,0,0)"><br>=
</span></div></code></div>I don't think it is useful. you are not namin=
g an argument here.</div><div><br></div><div>Now, to be fair, you could do =
something equivalent in C++20:</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:rgb(0,0,136)">int</span><span style=
=3D"color:rgb(0,0,0)"> foo</span><span style=3D"color:rgb(102,102,0)">(</sp=
an><span style=3D"color:rgb(0,0,0)">std</span><span style=3D"color:rgb(102,=
102,0)">::</span><span style=3D"color:rgb(0,0,0)">tag</span><span style=3D"=
color:rgb(102,102,0)"><</span><span style=3D"color:rgb(0,136,0)">"t=
ag_name"</span><span style=3D"color:rgb(102,102,0)">>,</span><span =
style=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(0,0,136)">float=
</span><span style=3D"color:rgb(0,0,0)"> f</span><span style=3D"color:rgb(1=
02,102,0)">);</span><span style=3D"color:rgb(0,0,0)"><br><br>foo</span><spa=
n style=3D"color:rgb(102,102,0)">(</span><span style=3D"color:rgb(0,136,0)"=
>"tag_name"</span><span style=3D"color:rgb(0,0,0)">tag</span><spa=
n style=3D"color:rgb(102,102,0)">,</span><span style=3D"color:rgb(0,0,0)"> =
</span><span style=3D"color:rgb(0,102,102)">1.f</span><span style=3D"color:=
rgb(102,102,0)">);</span><span style=3D"color:rgb(0,0,0)"><br></span></div>=
</code></div></div><div><br></div><div>But the shorthand syntax would be ve=
ry nice.</div><div>Moreover, such a shorthand syntax would give people ince=
ntives to use it (I consider it a good thing).</div><div>Let's make a q=
uick poll. Which one do you prefer? (try to see it as a newcomer to the lan=
guage)<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><sp=
an style=3D"color:rgb(0,0,0)">std</span><span style=3D"color:rgb(102,102,0)=
">::</span><span style=3D"color:rgb(0,0,0)">find_if</span><span style=3D"co=
lor:rgb(102,102,0)">(</span><span style=3D"color:rgb(0,0,0)">v</span><span =
style=3D"color:rgb(102,102,0)">.</span><span style=3D"color:rgb(0,0,136)">b=
egin</span><span style=3D"color:rgb(102,102,0)">(),</span><span style=3D"co=
lor:rgb(0,0,0)"> v</span><span style=3D"color:rgb(102,102,0)">.</span><span=
style=3D"color:rgb(0,0,136)">end</span><span style=3D"color:rgb(102,102,0)=
">(),</span><span style=3D"color:rgb(0,0,0)"> functor</span><span style=3D"=
color:rgb(102,102,0)">);</span><span style=3D"color:rgb(0,0,0)"><br>std</sp=
an><span style=3D"color:rgb(102,102,0)">::</span><span style=3D"color:rgb(0=
,0,0)">find</span><span style=3D"color:rgb(102,102,0)">(</span><span style=
=3D"color:rgb(0,0,0)">v</span><span style=3D"color:rgb(102,102,0)">.</span>=
<span style=3D"color:rgb(0,0,136)">begin</span><span style=3D"color:rgb(102=
,102,0)">(),</span><span style=3D"color:rgb(0,0,0)"> v</span><span style=3D=
"color:rgb(102,102,0)">.</span><span style=3D"color:rgb(0,0,136)">end</span=
><span style=3D"color:rgb(102,102,0)">(),</span><span style=3D"color:rgb(0,=
0,0)"> </span><span style=3D"color:rgb(0,136,0)">"if"</span><span=
style=3D"color:rgb(0,0,0)">tag</span><span style=3D"color:rgb(102,102,0)">=
,</span><span style=3D"color:rgb(0,0,0)"> functor</span><span style=3D"colo=
r:rgb(102,102,0)">);</span><span style=3D"color:rgb(0,0,0)"><code><span sty=
le=3D"color:rgb(0,0,0)"><br>std</span><span style=3D"color:rgb(102,102,0)">=
::</span><span style=3D"color:rgb(0,0,0)">find</span><span style=3D"color:r=
gb(102,102,0)">(</span><span style=3D"color:rgb(0,0,0)">v</span><span style=
=3D"color:rgb(102,102,0)">.</span><span style=3D"color:rgb(0,0,136)">begin<=
/span><span style=3D"color:rgb(102,102,0)">(),</span><span style=3D"color:r=
gb(0,0,0)"> v</span><span style=3D"color:rgb(102,102,0)">.</span><span styl=
e=3D"color:rgb(0,0,136)">end</span><span style=3D"color:rgb(102,102,0)">(),=
</span><span style=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(0,=
0,136)">if</span><span style=3D"color:rgb(102,102,0)">:</span><span style=
=3D"color:rgb(0,0,0)"> functor</span><span style=3D"color:rgb(102,102,0)">)=
;</span><span style=3D"color:rgb(0,0,0)"><br></span></code></span></div></c=
ode></div><br>I personally prefer the third one (I would like it even more =
with ranges).</div><div>This is not really about the possibility to do it n=
ow, but how the syntax looks.<br></div><div><br></div><div>Overall I want t=
o clarify: that's my opinion, and I'm pretty sure some will disagre=
e, but I really think it is worth pursuing.</div></div></div></div></blockq=
uote><div><br></div><div>I'm stating to see value in this approach. Bas=
ically it's automatic tagging.</div><div><br></div><div>FWIW I agree, t=
he third looks the most favourable.</div><div><br></div><div>What would loo=
k even more favourable IMHO would be:</div><div><br></div><div><span style=
=3D"color:rgb(0,0,0);font-family:monospace;font-size:small;background-color=
:rgb(250,250,250)">std</span><span style=3D"font-family:monospace;font-size=
:small;background-color:rgb(250,250,250);color:rgb(102,102,0)">::</span><sp=
an style=3D"color:rgb(0,0,0);font-family:monospace;font-size:small;backgrou=
nd-color:rgb(250,250,250)">find</span><span style=3D"font-family:monospace;=
font-size:small;background-color:rgb(250,250,250);color:rgb(102,102,0)">(</=
span><span style=3D"color:rgb(0,0,0);font-family:monospace;font-size:small;=
background-color:rgb(250,250,250)">v</span><span style=3D"font-family:monos=
pace;font-size:small;background-color:rgb(250,250,250);color:rgb(102,102,0)=
">.</span><span style=3D"font-family:monospace;font-size:small;background-c=
olor:rgb(250,250,250);color:rgb(0,0,136)">begin</span><span style=3D"font-f=
amily:monospace;font-size:small;background-color:rgb(250,250,250);color:rgb=
(102,102,0)">(),</span><span style=3D"color:rgb(0,0,0);font-family:monospac=
e;font-size:small;background-color:rgb(250,250,250)"><span>=C2=A0</span>v</=
span><span style=3D"font-family:monospace;font-size:small;background-color:=
rgb(250,250,250);color:rgb(102,102,0)">.</span><span style=3D"font-family:m=
onospace;font-size:small;background-color:rgb(250,250,250);color:rgb(0,0,13=
6)">end</span><span style=3D"font-family:monospace;font-size:small;backgrou=
nd-color:rgb(250,250,250);color:rgb(102,102,0)">(),</span><span style=3D"co=
lor:rgb(0,0,0);font-family:monospace;font-size:small;background-color:rgb(2=
50,250,250)"><span>=C2=A0</span></span><span style=3D"font-family:monospace=
;font-size:small;background-color:rgb(250,250,250);color:rgb(0,0,136)"><wbr=
>if</span><span style=3D"font-family:monospace;font-size:small;background-c=
olor:rgb(250,250,250)"><font color=3D"#666600">=3D</font></span><span style=
=3D"color:rgb(0,0,0);font-family:monospace;font-size:small;background-color=
:rgb(250,250,250)">functor</span><span style=3D"font-family:monospace;font-=
size:small;background-color:rgb(250,250,250);color:rgb(102,102,0)">)</span>=
<br></div><div><span style=3D"font-family:monospace;font-size:small;backgro=
und-color:rgb(250,250,250);color:rgb(102,102,0)"><br></span></div><div>I ap=
preciate that this would require a little more context-sensitive syntax par=
sing, but it's then as readable as python's named arguments.</div><=
/div></div></blockquote><div><br></div><div>Problem is: it would give ambig=
uous syntax:<div style=3D"background-color: rgb(250, 250, 250); border-colo=
r: rgb(187, 187, 187); border-style: solid; border-width: 1px; overflow-wra=
p: break-word;" class=3D"prettyprint"><code class=3D"prettyprint"><div clas=
s=3D"subprettyprint"><span style=3D"color: #008;" class=3D"styled-by-pretti=
fy">int</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> fo=
o </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=3D</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span s=
tyle=3D"color: #066;" class=3D"styled-by-prettify">5</span><span style=3D"c=
olor: #660;" class=3D"styled-by-prettify">;</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"><br>bar</span><span style=3D"color: #660;"=
class=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=3D=
"styled-by-prettify">foo</span><span style=3D"color: #660;" class=3D"styled=
-by-prettify">=3D</span><span style=3D"color: #066;" class=3D"styled-by-pre=
ttify">3</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">// bar(std::tag&=
lt;"foo">{}, 3);</span><span style=3D"color: #000;" class=3D"s=
tyled-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-pr=
ettify"><br></span><span style=3D"color: #800;" class=3D"styled-by-prettify=
">// bar( (foo =3D 3) );</span><span style=3D"color: #000;" class=3D"styled=
-by-prettify"><br></span><span style=3D"color: #800;" class=3D"styled-by-pr=
ettify">// ?</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
"><br></span></div></code></div></div><div><br></div><div>That's why I =
think the colon is the right choice.</div><div>=C2=A0</div><blockquote clas=
s=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 class=3D"gmail_quote"><d=
iv><br></div><div>Similarly, if we could declare defaults in the declaratio=
n in spite of c++'s current limitation of only allowing defaults on the=
trailing arguments, this would be great, no?</div><div><br></div><div>exam=
ple:</div><div><br></div><div><font face=3D"monospace, monospace">auto bind=
_and_listen(socket: socket& sock,=C2=A0</font></div><div><font face=3D"=
monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0iface: socket_interface_def =3D inet46_interface(0)=
,=C2=A0</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0port: int por=
t =3D 0,=C2=A0</font></div><div><font face=3D"monospace, monospace">=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0backlo=
g: int backlog =3D 5);</font></div><div><br></div><div>possible usages:</di=
v><div><br></div><div><font face=3D"monospace, monospace">socket s;</font><=
/div><div><div style=3D"font-size:small;background-color:rgb(255,255,255)">=
<font face=3D"monospace, monospace">bind_and_listen(s, port:1025);=C2=A0 //=
listen on all interfaces on port 1025 with backlog 5</font></div><div styl=
e=3D"font-size:small;background-color:rgb(255,255,255)"><font face=3D"monos=
pace, monospace"><span style=3D"float:none;display:inline">bind_and_listen(=
s, iface =3D ipv4(127,0,0,1), backlog=3D20);=C2=A0 // listen on localhost o=
n auto-allocated port with backlog 20</span><br><span style=3D"float:none;d=
isplay:inline">bind_and_listen(s);=C2=A0 // listen on all interfaces on aut=
o-allocated port with backlog 5</span><br></font><br></div><br></div></div>=
</div></blockquote><div>For this, I would say you could do it in library:</=
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">template</span><span style=3D"color: #000;" class=3D"styled=
-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-prett=
ify"><</span><span style=3D"color: #008;" class=3D"styled-by-prettify">c=
lass</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: #606;" class=3D"styled-by-prettify">Args</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">></span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #=
008;" class=3D"styled-by-prettify">struct</span><span style=3D"color: #000;=
" class=3D"styled-by-prettify"> </span><span style=3D"color: #606;" class=
=3D"styled-by-prettify">PythonArgs</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D"style=
d-by-prettify">:</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"> std</span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
::</span><span style=3D"color: #000;" class=3D"styled-by-prettify">tuple</s=
pan><span style=3D"color: #660;" class=3D"styled-by-prettify"><</span><s=
pan style=3D"color: #606;" class=3D"styled-by-prettify">Args</span><span st=
yle=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">{</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #606;" cl=
ass=3D"styled-by-prettify">PythonArgs</span><span style=3D"color: #660;" cl=
ass=3D"styled-by-prettify">(</span><span style=3D"color: #606;" class=3D"st=
yled-by-prettify">Args</span><span style=3D"color: #000;" class=3D"styled-b=
y-prettify"> args</span><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify">)</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> <=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">:</span><sp=
an style=3D"color: #000;" class=3D"styled-by-prettify"> std</span><span sty=
le=3D"color: #660;" class=3D"styled-by-prettify">::</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify">tuple</span><span style=3D"color: =
#660;" class=3D"styled-by-prettify"><</span><span style=3D"color: #606;"=
class=3D"styled-by-prettify">Args</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">>(</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify">std</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">::</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy">forward</span><span style=3D"color: #660;" class=3D"styled-by-prettify"=
><</span><span style=3D"color: #606;" class=3D"styled-by-prettify">Args<=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">>(</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify">args</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">{}</span><span style=3D"color: #000;"=
class=3D"styled-by-prettify"><br><br>=C2=A0 </span><span style=3D"color: #=
008;" class=3D"styled-by-prettify">template</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=
=3D"styled-by-prettify"><</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify">std</span><span style=3D"color: #660;" class=3D"styled-by=
-prettify">::</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y">size_t I</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 </span><span style=3D"color: #008;" class=3D"styled-by-prettify">aut=
o</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><=
span style=3D"color: #008;" class=3D"styled-by-prettify">get</span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify">std</span><span style=3D"color: #6=
60;" class=3D"styled-by-prettify">::</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify">integral_constant</span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify"><</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify">std</span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">::</span><span style=3D"color: #000;" class=3D"styled-b=
y-prettify">size_t</span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">,</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> =
I</span><span style=3D"color: #660;" class=3D"styled-by-prettify">></spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span s=
tyle=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: #=
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">const</span><span style=3D"color: #660;" class=3D"styled=
-by-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"> </span><span style=3D"color: #800;" class=3D"styled-by-prettify">// p=
ositional parameters</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"><br><br>=C2=A0 </span><span style=3D"color: #008;" class=3D"style=
d-by-prettify">template</span><span style=3D"color: #000;" class=3D"styled-=
by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy"><</span><span style=3D"color: #008;" class=3D"styled-by-prettify">cl=
ass</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> T</spa=
n><span style=3D"color: #660;" class=3D"styled-by-prettify">></span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><sp=
an style=3D"color: #008;" class=3D"styled-by-prettify">auto</span><span sty=
le=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"col=
or: #008;" class=3D"styled-by-prettify">get</span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify">T</span><span style=3D"color: #660;" class=3D"style=
d-by-prettify">)</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">con=
st</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: #800;" class=3D"styled-by-prettify">// keyword parameters</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><spa=
n style=3D"color: #660;" class=3D"styled-by-prettify">};</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"><br><br></span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">template</span><span 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: #008=
;" class=3D"styled-by-prettify">class</span><span style=3D"color: #660;" cl=
ass=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">Args</span><span style=3D"color: #660;" class=3D"styled-by-prett=
ify">></span><span style=3D"color: #000;" class=3D"styled-by-prettify"><=
br></span><span style=3D"color: #008;" class=3D"styled-by-prettify">auto</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify"> bind_and_lis=
ten</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</span=
><span style=3D"color: #606;" class=3D"styled-by-prettify">Args</span><span=
style=3D"color: #660;" class=3D"styled-by-prettify">&&...</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"> args</span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify">)</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">{</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #606;" clas=
s=3D"styled-by-prettify">PythonArgs</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"> pargs</span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">(</span><span style=3D"color: #000;" class=3D"styled-b=
y-prettify">std</span><span style=3D"color: #660;" class=3D"styled-by-prett=
ify">::</span><span style=3D"color: #000;" class=3D"styled-by-prettify">for=
ward</span><span style=3D"color: #660;" class=3D"styled-by-prettify"><</=
span><span style=3D"color: #606;" class=3D"styled-by-prettify">Args</span><=
span style=3D"color: #660;" class=3D"styled-by-prettify">>(</span><span =
style=3D"color: #000;" class=3D"styled-by-prettify">args</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 </span><span style=3D=
"color: #008;" class=3D"styled-by-prettify">auto</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"> socket </span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify"> pargs</span><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">.</span><span style=3D"color: #008;" class=3D"styl=
ed-by-prettify">get</span><span style=3D"color: #660;" class=3D"styled-by-p=
rettify">(</span><span style=3D"color: #000;" class=3D"styled-by-prettify">=
socket</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 =
</span><span style=3D"color: #008;" class=3D"styled-by-prettify">auto</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify"> port </span><sp=
an style=3D"color: #660;" class=3D"styled-by-prettify">=3D</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify"> pargs</span><span style=3D=
"color: #660;" class=3D"styled-by-prettify">.</span><span style=3D"color: #=
008;" class=3D"styled-by-prettify">get</span><span style=3D"color: #660;" c=
lass=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify">port</span><span style=3D"color: #660;" class=3D"styled-=
by-prettify">:);</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-pre=
ttify">/* ... */</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"><br></span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
}</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></spa=
n></div></code></div><br>That would be much easier to standardize, while st=
ill being powerful enough for most cases.<br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/316cd6ec-6266-4316-a676-e6bf557154f9%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/316cd6ec-6266-4316-a676-e6bf557154f9=
%40isocpp.org</a>.<br />
------=_Part_164_1092868317.1533209943997--
------=_Part_163_397881633.1533209943995--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 2 Aug 2018 06:43:29 -0700 (PDT)
Raw View
------=_Part_210_1853242523.1533217409310
Content-Type: multipart/alternative;
boundary="----=_Part_211_1095863034.1533217409311"
------=_Part_211_1095863034.1533217409311
Content-Type: text/plain; charset="UTF-8"
On Thursday, August 2, 2018 at 6:49:18 AM UTC-4, Florian Lemaitre wrote:
>
> 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.
>
I personally prefer being able to know how many arguments a function takes.
With the `tag`, the number of arguments is clearly 4. With the colon
syntax, it *looks* like 3, even though its 4.
Also, I personally prefer #1, since there's no ambiguity on what's going
on. That is, even if you have tag generators like this, they shouldn't be
used here.
--
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/70d09325-a8dd-4001-9317-26e083fe1b55%40isocpp.org.
------=_Part_211_1095863034.1533217409311
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Thursday, August 2, 2018 at 6:49:18 AM UTC-4, Florian L=
emaitre wrote:<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><div><div></div><div>Now, to be fair, you could do something equivale=
nt in C++20:</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:rgb(0,0,136)">int</span><span style=3D"color:rgb(0,0,0)=
"> foo</span><span style=3D"color:rgb(102,102,0)">(</span><span style=3D"co=
lor:rgb(0,0,0)">std</span><span style=3D"color:rgb(102,102,0)">::</span><sp=
an style=3D"color:rgb(0,0,0)">tag</span><span style=3D"color:rgb(102,102,0)=
"><</span><span style=3D"color:rgb(0,136,0)">"tag_name"</span>=
<span style=3D"color:rgb(102,102,0)">>,</span><span style=3D"color:rgb(0=
,0,0)"> </span><span style=3D"color:rgb(0,0,136)">float</span><span style=
=3D"color:rgb(0,0,0)"> f</span><span style=3D"color:rgb(102,102,0)">);</spa=
n><span style=3D"color:rgb(0,0,0)"><br><br>foo</span><span style=3D"color:r=
gb(102,102,0)">(</span><span style=3D"color:rgb(0,136,0)">"tag_name&qu=
ot;</span><span style=3D"color:rgb(0,0,0)">tag</span><span style=3D"color:r=
gb(102,102,0)">,</span><span style=3D"color:rgb(0,0,0)"> </span><span style=
=3D"color:rgb(0,102,102)">1.f</span><span style=3D"color:rgb(102,102,0)">);=
</span><span style=3D"color:rgb(0,0,0)"><br></span></div></code></div></div=
><div><br></div><div>But the shorthand syntax would be very nice.</div><div=
>Moreover, such a shorthand syntax would give people incentives to use it (=
I consider it a good thing).</div><div>Let's make a quick poll. Which o=
ne do you prefer? (try to see it as a newcomer to the language)<br></div><d=
iv><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:=
rgb(0,0,0)">std</span><span style=3D"color:rgb(102,102,0)">::</span><span s=
tyle=3D"color:rgb(0,0,0)">find_if</span><span style=3D"color:rgb(102,102,0)=
">(</span><span style=3D"color:rgb(0,0,0)">v</span><span style=3D"color:rgb=
(102,102,0)">.</span><span style=3D"color:rgb(0,0,136)">begin</span><span s=
tyle=3D"color:rgb(102,102,0)">(),</span><span style=3D"color:rgb(0,0,0)"> v=
</span><span style=3D"color:rgb(102,102,0)">.</span><span style=3D"color:rg=
b(0,0,136)">end</span><span style=3D"color:rgb(102,102,0)">(),</span><span =
style=3D"color:rgb(0,0,0)"> functor</span><span style=3D"color:rgb(102,102,=
0)">);</span><span style=3D"color:rgb(0,0,0)"><br>std</span><span style=3D"=
color:rgb(102,102,0)">::</span><span style=3D"color:rgb(0,0,0)">find</span>=
<span style=3D"color:rgb(102,102,0)">(</span><span style=3D"color:rgb(0,0,0=
)">v</span><span style=3D"color:rgb(102,102,0)">.</span><span style=3D"colo=
r:rgb(0,0,136)">begin</span><span style=3D"color:rgb(102,102,0)">(),</span>=
<span style=3D"color:rgb(0,0,0)"> v</span><span style=3D"color:rgb(102,102,=
0)">.</span><span style=3D"color:rgb(0,0,136)">end</span><span style=3D"col=
or:rgb(102,102,0)">(),</span><span style=3D"color:rgb(0,0,0)"> </span><span=
style=3D"color:rgb(0,136,0)">"if"</span><span style=3D"color:rgb=
(0,0,0)">tag</span><span style=3D"color:rgb(102,102,0)">,</span><span style=
=3D"color:rgb(0,0,0)"> functor</span><span style=3D"color:rgb(102,102,0)">)=
;</span><span style=3D"color:rgb(0,0,0)"><code><span style=3D"color:rgb(0,0=
,0)"><br>std</span><span style=3D"color:rgb(102,102,0)">::</span><span styl=
e=3D"color:rgb(0,0,0)">find</span><span style=3D"color:rgb(102,102,0)">(</s=
pan><span style=3D"color:rgb(0,0,0)">v</span><span style=3D"color:rgb(102,1=
02,0)">.</span><span style=3D"color:rgb(0,0,136)">begin</span><span style=
=3D"color:rgb(102,102,0)">(),</span><span style=3D"color:rgb(0,0,0)"> v</sp=
an><span style=3D"color:rgb(102,102,0)">.</span><span style=3D"color:rgb(0,=
0,136)">end</span><span style=3D"color:rgb(102,102,0)">(),</span><span styl=
e=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(0,0,136)">if</span>=
<span style=3D"color:rgb(102,102,0)">:</span><span style=3D"color:rgb(0,0,0=
)"> functor</span><span style=3D"color:rgb(102,102,0)">);</span><span style=
=3D"color:rgb(0,0,0)"><br></span></code></span></div></code></div><br>I per=
sonally prefer the third one (I would like it even more with ranges).</div>=
</div></div></div></blockquote><blockquote class=3D"gmail_quote" style=3D"m=
argin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"=
><div dir=3D"ltr"><div><div><div>This is not really about the possibility t=
o do it now, but how the syntax looks.<br></div></div></div></div></blockqu=
ote><div><br></div><div><div>I personally prefer being able to know how man=
y arguments a=20
function takes. With the `tag`, the number of arguments is clearly 4.=20
With the colon syntax, it <i>looks</i> like 3, even though its 4.<br></div>=
</div><div><br></div><div>Also, I personally prefer #1, since there's n=
o ambiguity on what's going on. That is, even if you have tag generator=
s like this, they shouldn't be used here.<br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/70d09325-a8dd-4001-9317-26e083fe1b55%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/70d09325-a8dd-4001-9317-26e083fe1b55=
%40isocpp.org</a>.<br />
------=_Part_211_1095863034.1533217409311--
------=_Part_210_1853242523.1533217409310--
.
Author: mihailnajdenov@gmail.com
Date: Thu, 2 Aug 2018 06:49:19 -0700 (PDT)
Raw View
------=_Part_223_549237990.1533217759371
Content-Type: multipart/alternative;
boundary="----=_Part_224_1571148610.1533217759372"
------=_Part_224_1571148610.1533217759372
Content-Type: text/plain; charset="UTF-8"
On Thursday, August 2, 2018 at 3:46:32 AM UTC+3, Nicol Bolas wrote:
>
> On Wednesday, August 1, 2018 at 6:02:28 PM UTC-4, mihailn...@gmail.com
> wrote:
>>
>> Nicol, the most important difference is the fact, names are different
>> from arguments - this *radically* improves the expressiveness of names
>> (names like 'equalTo', 'with', 'including', 'forValue' become feasible)
>> and frees the library developer to use and change the arguments at any time.
>>
>> Also, wrong names are errors, not a warnings.
>> About forwarding, we formerly must handle the case as the implementation
>> must know against which call to check the name. I see forwarding as pretty
>> much a must, considering we want to make_objects and constructors are
>> number one client of named arguments.
>>
>
> And that's exactly why it should be a warning, not an error. Because
> you're not going to *always* be able to tell.
>
> Let's say you have your own `make_` function, but it logs the arguments
> with something like `(log(std::forward<Args>(args)), ...)` before calling
> the constructor. That means you're going to forward each parameter to a
> function. That function will be overloaded on each supported type to
> extract the value for the logging operation (perhaps with some template
> default). So... how does that work?
>
There are few ways around this
template<class... T>
Object make(T&&... args)
{
log(args...);
return Object(std::forward<T>(args)...);
}
This works as per current rules.
*However* we could improve the rules to create a pass-trough
template<class T>
decltype(auto) log(T&& a)
{
std::count << a;
return std::forward<T>(a);
}
If we return a (possibly annotated) forward, and the return type is deduced
(or we invent a attribute for that), then the call of the function is
annotated instead.
Object(log(std::forward<T>(args))...);
// generates
// => Object(foo: log(foo: something));
> ...
>
> In fact, I just realized that `std::forward` *itself* wouldn't work,
> since its argument does not have the corresponding name. So how can you
> call it with a named parameter?
>
> And if you special-case this as some magical property of `std::forward`...
> what happens if people use the equivalent `static_cast`? Or is that
> special-cased as well?
>
We can declare reference collapsing actually forces the compiler to add
annotation, then use the above new rule to create std::forward itself.
> If this is going to work, you need to lay down *exactly* what the rules
> are for this forwarding of named parameters.
>
Absolutely. But it is very important both to be errors and to work with it.
To work is important, because this is standard and recommended way of
creating objects, not just some minor library helper.
To be an error is important because A) It is breach of contract in
basically all cases to get the arguments wrong. B) Nowadays we have very
aggressive static analyses which are great but tend to generate false
positives - warnings might go unnoticed.
About macros. I believe names will not break on user-defined macros,
because the compiler should not look for macros when he sees something:
If the standard library decides to have names for a function, the
implementation will just add another declaration with names.
#if __supports_names__
double assoc_legendre( unsigned n:, unsigned m:, double);
#endif
*// old code stays as-is 100%*
double assoc_legendre( unsigned __n, unsigned __m, double __x )
{
// . . .
}
About SFINAE - names are outside the typesystem. They kick in after all
types-related rules in order to catch semantic errors, not naturally
mappable to types.
If there is a name mismatch and one removes the name on the call site, the
call succeeds because, to be caught that late, it means the types are
correct as far as C++ is concerned.
As a side effect overload resolution failure will be reported *before* name
mismatch (if any), however the compiler will be able to use the names on
both call and declaration to create way, way better diagnostics.
Florian, I will answer later separately about tags
--
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/5032580c-bdbc-4947-8025-5385aa497088%40isocpp.org.
------=_Part_224_1571148610.1533217759372
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Thursday, August 2, 2018 at 3:46:32 AM UTC+3, N=
icol Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"l=
tr">On Wednesday, August 1, 2018 at 6:02:28 PM UTC-4, <a>mihailn...@gmail.c=
om</a> 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>=
Nicol, the most important difference is the fact, names are different from =
arguments - this <i>radically</i> improves the expressiveness of names (nam=
es like 'equalTo', 'with', 'including', 'forVal=
ue'=C2=A0 become feasible) and frees the library developer to use and c=
hange the arguments at any time.</div><div><br></div><div>Also, wrong names=
are errors, not a warnings.=C2=A0</div><div>About forwarding, we formerly =
must handle the case as the implementation must know against which call to =
check the name. I see forwarding as pretty much a must, considering we want=
to make_objects and constructors are number one client of named arguments.=
<br></div></div></blockquote><div><br></div><div>And that's exactly why=
it should be a warning, not an error. Because you're not going to <i>a=
lways</i> be able to tell.</div><div><br></div><div>Let's say you have =
your own `make_` function, but it logs the arguments with something like `(=
log(std::forward<Args>(args)<wbr>), ...)` before calling the construc=
tor. That means you're going to forward each parameter to a function. T=
hat function will be overloaded on each supported type to extract the value=
for the logging operation (perhaps with some template default). So... how =
does that work?</div></div></blockquote><div><br></div><div><br></div><div>=
There are few ways around this</div><div><br></div><div><font face=3D"couri=
er new,monospace">template<class... T><br>Object make(T&&... =
args)<br>{<br><div>=C2=A0 =C2=A0 log(args...);</div><div><br></div>=C2=A0=
=C2=A0=C2=A0 return Object(std::forward<T>(args)...);<br>}</font><br>=
</div><div><font face=3D"courier new,monospace"></font><br></div><div>This =
works as per current rules.</div><div><br></div><div><br></div><div><i>Howe=
ver</i> we could improve the rules to create a pass-trough</div><div><br></=
div><div><font face=3D"courier new,monospace">template<class T><br>de=
cltype(auto) log(T&& a)=C2=A0<br>{<br><div>=C2=A0=C2=A0=C2=A0 std::=
count << a;</div><div><br></div>=C2=A0=C2=A0=C2=A0 return std::forwar=
d<T>(a);=C2=A0<br>}</font><br></div><div><br></div><div>If we return =
a (possibly annotated) forward, and the return type is deduced (or we inven=
t a attribute for that), then the call of the function is annotated instead=
..</div><div><br></div><div><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: l=
eft; text-decoration: none; text-indent: 0px; text-transform: none; -webkit=
-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">Object(lo=
g(std::forward<T>(args))...);</span><b></b><i></i><u></u><sub></sub><=
sup></sup><strike></strike><br></div><div><font face=3D"courier new,monospa=
ce"></font><br></div><div><font face=3D"courier new,monospace">// generates=
</font></div><div><font face=3D"courier new,monospace">// =3D> Object(fo=
o: log(foo: something));</font></div><div><font face=3D"courier new,monospa=
ce"><br></font></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"ltr"><div><font face=3D"courier new,monospace"></font><br></div><div>..=
..</div><div><br></div><div>In fact, I just realized that `std::forward` <i>=
itself</i> wouldn't work, since its argument does not have the correspo=
nding name. So how can you call it with a named parameter?</div><div><br></=
div><div>And if you special-case this as some magical property of `std::for=
ward`... what happens if people use the equivalent `static_cast`? Or is tha=
t special-cased as well?<br></div></div></blockquote><div><br></div><div><b=
r></div><div>We can declare reference collapsing actually forces the compil=
er to add annotation, then use the above new rule to create std::forward it=
self.</div><div><br></div><div><br></div><blockquote class=3D"gmail_quote" =
style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-l=
eft: 1ex;"><div dir=3D"ltr"><div></div><div><br></div><div>If this is going=
to work, you need to lay down <i>exactly</i> what the rules are for this f=
orwarding of named parameters.</div></div></blockquote><div><br></div><div>=
Absolutely. But it is very important both to be errors and to work with it.=
To work is important, because this is standard and recommended way of crea=
ting objects, not just some minor library helper.</div><div><br></div><div>=
To be an error is important because A) It is breach of contract in basicall=
y all cases to get the arguments wrong. B) Nowadays we have very aggressive=
static analyses which are great but tend to generate false positives - war=
nings might go unnoticed. =C2=A0</div><div><br></div><div><br></div><div>Ab=
out macros. I believe names will not break on user-defined macros, because =
the compiler should not look for macros when he sees <font face=3D"courier =
new,monospace">something:</font></div><div><font face=3D"courier new,monosp=
ace"><br></font></div><div>If the standard library decides to have names fo=
r a function, the implementation will just add another declaration with nam=
es.</div><div><br></div><div>#if __supports_names__<br></div><div><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;"><span style=3D"display: inline !important; fl=
oat: none; background-color: transparent; color: rgb(34, 34, 34); font-fami=
ly: courier new,monospace; font-size: 13px; font-style: normal; font-varian=
t: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align=
: left; text-decoration: none; text-indent: 0px; text-transform: none; -web=
kit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">double=
</span>assoc_legendre( unsigned n:, unsigned m:, double);</span><br></div>=
<div>#endif</div><div><br></div><div><font face=3D"courier new,monospace"><=
i>// old code stays as-is 100%</i></font></div><div><font face=3D"courier n=
ew,monospace"></font><i></i><br></div><div><span 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); display: in=
line; float: none; font-family: courier new,monospace; 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;">double assoc_legendre( unsigned __n, unsigned __m, =
double __x )</span></div><div><font face=3D"courier new,monospace">{</font>=
</div><div><font face=3D"courier new,monospace">=C2=A0 // . . .</font></div=
><div><font face=3D"courier new,monospace">}</font></div><div><b></b><i></i=
><u></u><sub></sub><sup></sup><strike></strike><font face=3D"courier new,mo=
nospace"></font><br></div><div><br></div><div><br></div><div>About <span st=
yle=3D"display: inline !important; float: none; background-color: transpare=
nt; color: rgb(34, 34, 34); font-family: "Arial","Helvetica&=
quot;,sans-serif; 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;">SFINAE - names =
are outside the typesystem. They kick in after all types-related rules in o=
rder to catch semantic errors, not naturally mappable to types. =C2=A0</spa=
n></div><div><span style=3D"display: inline !important; float: none; backgr=
ound-color: transparent; color: rgb(34, 34, 34); font-family: "Arial&q=
uot;,"Helvetica",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;">If there is a name mismatch and one removes the name on the call site=
, the call succeeds because, to be caught that late, it means the types are=
correct as far as C++ is concerned. =C2=A0</span></div><div><span style=3D=
"display: inline !important; float: none; background-color: transparent; co=
lor: rgb(34, 34, 34); font-family: "Arial","Helvetica",=
sans-serif; 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;">As a side effect over=
load resolution failure will be reported <i>before</i> name mismatch (if an=
y), however the compiler will be able to use the names on both call and dec=
laration to create way, way better diagnostics.=C2=A0</span></div><div><spa=
n style=3D"display: inline !important; float: none; background-color: trans=
parent; color: rgb(34, 34, 34); font-family: "Arial","Helvet=
ica",sans-serif; font-size: 13px; font-style: normal; font-variant: no=
rmal; font-weight: 400; letter-spacing: normal; orphans: 2; 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;"><br></span>=
</div><div><span style=3D"display: inline !important; float: none; backgrou=
nd-color: transparent; color: rgb(34, 34, 34); font-family: "Arial&quo=
t;,"Helvetica",sans-serif; font-size: 13px; font-style: normal; f=
ont-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: 0p=
x;"><br></span></div><div><span style=3D"display: inline !important; float:=
none; background-color: transparent; color: rgb(34, 34, 34); font-family: =
"Arial","Helvetica",sans-serif; font-size: 13px; font-s=
tyle: normal; font-variant: normal; font-weight: 400; letter-spacing: norma=
l; orphans: 2; 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;"><br></span></div><div><span style=3D"display: inline !im=
portant; float: none; background-color: transparent; color: rgb(34, 34, 34)=
; font-family: "Arial","Helvetica",sans-serif; 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;">Florian, I will answer later separately a=
bout tags</span></div><div><span style=3D"display: inline !important; float=
: none; background-color: transparent; color: rgb(34, 34, 34); font-family:=
"Arial","Helvetica",sans-serif; font-size: 13px; font-=
style: normal; font-variant: normal; font-weight: 400; letter-spacing: norm=
al; 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;"><br></span></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/5032580c-bdbc-4947-8025-5385aa497088%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/5032580c-bdbc-4947-8025-5385aa497088=
%40isocpp.org</a>.<br />
------=_Part_224_1571148610.1533217759372--
------=_Part_223_549237990.1533217759371--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 2 Aug 2018 08:21:12 -0700 (PDT)
Raw View
------=_Part_299_1910562555.1533223272476
Content-Type: multipart/alternative;
boundary="----=_Part_300_1019180686.1533223272477"
------=_Part_300_1019180686.1533223272477
Content-Type: text/plain; charset="UTF-8"
On Thursday, August 2, 2018 at 9:49:19 AM UTC-4, mihailn...@gmail.com wrote:
>
> On Thursday, August 2, 2018 at 3:46:32 AM UTC+3, Nicol Bolas wrote:
>>
>> On Wednesday, August 1, 2018 at 6:02:28 PM UTC-4, mihailn...@gmail.com
>> wrote:
>>>
>>> Nicol, the most important difference is the fact, names are different
>>> from arguments - this *radically* improves the expressiveness of names
>>> (names like 'equalTo', 'with', 'including', 'forValue' become feasible)
>>> and frees the library developer to use and change the arguments at any time.
>>>
>>> Also, wrong names are errors, not a warnings.
>>> About forwarding, we formerly must handle the case as the implementation
>>> must know against which call to check the name. I see forwarding as pretty
>>> much a must, considering we want to make_objects and constructors are
>>> number one client of named arguments.
>>>
>>
>> And that's exactly why it should be a warning, not an error. Because
>> you're not going to *always* be able to tell.
>>
>> Let's say you have your own `make_` function, but it logs the arguments
>> with something like `(log(std::forward<Args>(args)), ...)` before calling
>> the constructor. That means you're going to forward each parameter to a
>> function. That function will be overloaded on each supported type to
>> extract the value for the logging operation (perhaps with some template
>> default). So... how does that work?
>>
>
>
> There are few ways around this
>
> template<class... T>
> Object make(T&&... args)
> {
> log(args...);
>
> return Object(std::forward<T>(args)...);
> }
>
> This works as per current rules.
>
>
> *However* we could improve the rules to create a pass-trough
>
> template<class T>
> decltype(auto) log(T&& a)
> {
> std::count << a;
>
> return std::forward<T>(a);
> }
>
> If we return a (possibly annotated) forward, and the return type is
> deduced (or we invent a attribute for that), then the call of the function
> is annotated instead.
>
> Object(log(std::forward<T>(args))...);
>
> // generates
> // => Object(foo: log(foo: something));
>
>
When the rules are getting this complicated, you need to take a step back
and ask "if it requires all of this complexity, is this *really* a good
idea?" Bulldozer design of this type has a tendency to work out poorly and
inflexibly. See the Coroutines TS.
Not to mention the fact that now you're telling people to write their code
in a completely different way just to make logging *continue* working
correctly. It seems wrongheaded to tell other people to change their code
from the more natural syntax just to appease your new feature.
....
>>
>> In fact, I just realized that `std::forward` *itself* wouldn't work,
>> since its argument does not have the corresponding name. So how can you
>> call it with a named parameter?
>>
>> And if you special-case this as some magical property of
>> `std::forward`... what happens if people use the equivalent `static_cast`?
>> Or is that special-cased as well?
>>
>
>
> We can declare reference collapsing actually forces the compiler to add
> annotation, then use the above new rule to create std::forward itself.
>
So, what about `forward_as_tuple` and `std::apply`? We ought to be able to
pass named parameters through `std::async` and similar functions, right?
If this is going to work, you need to lay down *exactly* what the rules are
>> for this forwarding of named parameters.
>>
>
> Absolutely. But it is very important both to be errors and to work with it.
>
You have that backwards. If the rules don't allow them to be errors without
breaking something, then they can't be errors. You need to make sure that a
set of rules *can* be established before you can say that name mismatches
must be errors.
To work is important, because this is standard and recommended way of
> creating objects, not just some minor library helper.
>
> To be an error is important because A) It is breach of contract in
> basically all cases to get the arguments wrong.
>
The "contract" in C++ function calls is defined by our strong typing
system. A contract is violated when you provide incorrect types to a
function. This means that the contract visible at all levels of the code.
If you're in function A, and you call function B which passes your
parameters to function C, then we can see that.
If you want name mismatches to always be a "breach of contract", then that
contract needs to be part of the actual type system *at all levels*, not
some external channel of information that insinuates itself magically via
unknown means. If it's important enough to truly be part of the "contract"
of a function, then it's important enough for the name to be *required*,
not optional.
If all the name is for is to visually indicate something, on the level of a
comment, then building a system of rules making it an error is wrong.
B) Nowadays we have very aggressive static analyses which are great but
> tend to generate false positives - warnings might go unnoticed.
>
P0671's rules for it wouldn't generate false positives; it generates false
negatives: places where there is a mismatch, but the compiler doesn't see
it.
About macros. I believe names will not break on user-defined macros,
> because the compiler should not look for macros when he sees something:
>
That's not how the preprocessor works. `something:` is an identifier token
followed by a `:` token. If that identifier token names a macro, then the
preprocessor *will* convert it into something else.
This feature is not important enough to go changing the
preprocessor/tokenizer. Especially since that would break labels.
--
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/55cd8362-a67e-4a6a-8d58-3a93eb4ddb61%40isocpp.org.
------=_Part_300_1019180686.1533223272477
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Thursday, August 2, 2018 at 9:49:19 AM UTC-4, mihailn..=
..@gmail.com wrote:<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">On Thursday, August 2, 2018 at 3:46:32 AM UTC+3, Nicol Bolas wrote:<bl=
ockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-l=
eft:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">On Wednesday, August =
1, 2018 at 6:02:28 PM UTC-4, <a>mihailn...@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"><div>Nicol, the most important=
difference is the fact, names are different from arguments - this <i>radic=
ally</i> improves the expressiveness of names (names like 'equalTo'=
, 'with', 'including', 'forValue'=C2=A0 become feas=
ible) and frees the library developer to use and change the arguments at an=
y time.</div><div><br></div><div>Also, wrong names are errors, not a warnin=
gs.=C2=A0</div><div>About forwarding, we formerly must handle the case as t=
he implementation must know against which call to check the name. I see for=
warding as pretty much a must, considering we want to make_objects and cons=
tructors are number one client of named arguments.<br></div></div></blockqu=
ote><div><br></div><div>And that's exactly why it should be a warning, =
not an error. Because you're not going to <i>always</i> be able to tell=
..</div><div><br></div><div>Let's say you have your own `make_` function=
, but it logs the arguments with something like `(log(std::forward<Args&=
gt;(args)<wbr>), ...)` before calling the constructor. That means you'r=
e going to forward each parameter to a function. That function will be over=
loaded on each supported type to extract the value for the logging operatio=
n (perhaps with some template default). So... how does that work?</div></di=
v></blockquote><div><br></div><div><br></div><div>There are few ways around=
this</div><div><br></div><div><font face=3D"courier new,monospace">templat=
e<class... T><br>Object make(T&&... args)<br>{<br><div>=C2=A0=
=C2=A0 log(args...);</div><div><br></div>=C2=A0=C2=A0=C2=A0 return Object(=
std::forward<T>(args)..<wbr>.);<br>}</font><br></div><div><font face=
=3D"courier new,monospace"></font><br></div><div>This works as per current =
rules.</div><div><br></div><div><br></div><div><i>However</i> we could impr=
ove the rules to create a pass-trough</div><div><br></div><div><font face=
=3D"courier new,monospace">template<class T><br>decltype(auto) log(T&=
amp;& a)=C2=A0<br>{<br><div>=C2=A0=C2=A0=C2=A0 std::count << a;</=
div><div><br></div>=C2=A0=C2=A0=C2=A0 return std::forward<T>(a);=C2=
=A0<br>}</font><br></div><div><br></div><div>If we return a (possibly annot=
ated) forward, and the return type is deduced (or we invent a attribute for=
that), then the call of the function is annotated instead.</div><div><br><=
/div><div><span style=3D"display:inline!important;float:none;background-col=
or:transparent;color:rgb(34,34,34);font-family:courier new,monospace;font-s=
ize:13px;font-style:normal;font-variant:normal;font-weight:400;letter-spaci=
ng:normal;text-align:left;text-decoration:none;text-indent:0px;text-transfo=
rm:none;white-space:normal;word-spacing:0px">Object(log(std::forward<T&g=
t;(<wbr>args))...);</span><b></b><i></i><u></u><sub></sub><sup></sup><strik=
e></strike><br></div><div><font face=3D"courier new,monospace"></font><br><=
/div><div><font face=3D"courier new,monospace">// generates</font></div><di=
v><font face=3D"courier new,monospace">// =3D> Object(foo: log(foo: some=
thing));</font></div><div><font face=3D"courier new,monospace"><br></font><=
/div></div></blockquote><div><br></div><div>When the rules are getting this=
complicated, you need to take a step back and ask "if it requires all=
of this complexity, is this <i>really</i> a good idea?" Bulldozer des=
ign of this type has a tendency to work out poorly and inflexibly. See the =
Coroutines TS.</div><div><br></div><div></div><div>Not to mention the fact =
that now you're telling people to write their code in a completely diff=
erent way just to make logging <i>continue</i> working correctly. It seems =
wrongheaded to tell other people to change their code from the more natural=
syntax just to appease your new feature.</div><div><br></div><blockquote c=
lass=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px=
#ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><font face=3D"courier=
new,monospace"></font></div><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div d=
ir=3D"ltr"><div><font face=3D"courier new,monospace"></font></div><div>...<=
/div><div><br></div><div>In fact, I just realized that `std::forward` <i>it=
self</i> wouldn't work, since its argument does not have the correspond=
ing name. So how can you call it with a named parameter?</div><div><br></di=
v><div>And if you special-case this as some magical property of `std::forwa=
rd`... what happens if people use the equivalent `static_cast`? Or is that =
special-cased as well?<br></div></div></blockquote><div><br></div><div><br>=
</div><div>We can declare reference collapsing actually forces the compiler=
to add annotation, then use the above new rule to create std::forward itse=
lf.</div></div></blockquote><div></div><div><div><br></div>So, what about `=
forward_as_tuple` and
`std::apply`? We ought to be able to pass named parameters through=20
`std::async` and similar functions, right?</div><div><br></div><blockquote =
class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1p=
x #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div></div><blockquote cl=
ass=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></div><div></div><div>If th=
is is going to work, you need to lay down <i>exactly</i> what the rules are=
for this forwarding of named parameters.</div></div></blockquote><div><br>=
</div><div>Absolutely. But it is very important both to be errors and to wo=
rk with it.</div></div></blockquote><div><br></div><div>You have that backw=
ards. If the rules don't allow them to be errors without breaking somet=
hing, then they can't be errors. You need to make sure that a set of ru=
les <i>can</i> be established before you can say that name mismatches must =
be errors.</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"m=
argin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"=
><div dir=3D"ltr"><div>To work is important, because this is standard and r=
ecommended way of creating objects, not just some minor library helper.</di=
v></div></blockquote><blockquote class=3D"gmail_quote" style=3D"margin: 0px=
0px 0px 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1e=
x;"><div><br></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>To be an error is important because A) I=
t is breach of contract in basically all cases to get the arguments wrong.<=
/div></div></blockquote><div><br></div><div>The "contract" in C++=
function calls is defined by our strong typing system. A contract is viola=
ted when you provide incorrect types to a function. This means that the con=
tract visible at all levels of the code. If you're in function A, and y=
ou call function B which passes your parameters to function C, then we can =
see that.</div><div><br></div><div></div><div>If you want name mismatches t=
o always be a "breach of contract", then that contract needs to b=
e part of the actual type system <i>at all levels</i>, not some external ch=
annel of information that insinuates itself magically via unknown means. If=
it's important enough to truly be part of the "contract" of =
a function, then it's important enough for the name to be <i>required</=
i>, not optional.</div><div><br></div><div>If all the name is for is to vis=
ually indicate something, on the level of a comment, then building a system=
of rules making it an error is wrong.<br></div><div><br></div><blockquote =
class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1p=
x #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>B) Nowadays we have =
very aggressive static analyses which are great but tend to generate false =
positives - warnings might go unnoticed.<br></div></div></blockquote><div><=
br></div><div>P0671's rules for it wouldn't generate false positive=
s; it generates false negatives: places where there is a mismatch, but the =
compiler doesn't see it.<br></div><div><br></div><blockquote class=3D"g=
mail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc sol=
id;padding-left: 1ex;"><div dir=3D"ltr"><div></div><div></div><div>About ma=
cros. I believe names will not break on user-defined macros, because the co=
mpiler should not look for macros when he sees <font face=3D"courier new,mo=
nospace">something:</font></div></div></blockquote><div><br></div><div>That=
's not how the preprocessor works. `something:` is an identifier token =
followed by a `:` token. If that identifier token names a macro, then the p=
reprocessor <i>will</i> convert it into something else.</div><div><br></div=
><div>This feature is not important enough to go changing the preprocessor/=
tokenizer. Especially since that would break labels.<br></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/55cd8362-a67e-4a6a-8d58-3a93eb4ddb61%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/55cd8362-a67e-4a6a-8d58-3a93eb4ddb61=
%40isocpp.org</a>.<br />
------=_Part_300_1019180686.1533223272477--
------=_Part_299_1910562555.1533223272476--
.
Author: mihailnajdenov@gmail.com
Date: Thu, 2 Aug 2018 11:25:02 -0700 (PDT)
Raw View
------=_Part_378_175156957.1533234302978
Content-Type: multipart/alternative;
boundary="----=_Part_379_169144615.1533234302978"
------=_Part_379_169144615.1533234302978
Content-Type: text/plain; charset="UTF-8"
On Thursday, August 2, 2018 at 6:21:12 PM UTC+3, Nicol Bolas wrote:
>
> On Thursday, August 2, 2018 at 9:49:19 AM UTC-4, mihailn...@gmail.com
> wrote:
>>
>> On Thursday, August 2, 2018 at 3:46:32 AM UTC+3, Nicol Bolas wrote:
>>>
>>> On Wednesday, August 1, 2018 at 6:02:28 PM UTC-4, mihailn...@gmail.com
>>> wrote:
>>>>
>>>> Nicol, the most important difference is the fact, names are different
>>>> from arguments - this *radically* improves the expressiveness of names
>>>> (names like 'equalTo', 'with', 'including', 'forValue' become feasible)
>>>> and frees the library developer to use and change the arguments at any time.
>>>>
>>>> Also, wrong names are errors, not a warnings.
>>>> About forwarding, we formerly must handle the case as the
>>>> implementation must know against which call to check the name. I see
>>>> forwarding as pretty much a must, considering we want to make_objects and
>>>> constructors are number one client of named arguments.
>>>>
>>>
>>> And that's exactly why it should be a warning, not an error. Because
>>> you're not going to *always* be able to tell.
>>>
>>> Let's say you have your own `make_` function, but it logs the arguments
>>> with something like `(log(std::forward<Args>(args)), ...)` before calling
>>> the constructor. That means you're going to forward each parameter to a
>>> function. That function will be overloaded on each supported type to
>>> extract the value for the logging operation (perhaps with some template
>>> default). So... how does that work?
>>>
>>
>>
>> There are few ways around this
>>
>> template<class... T>
>> Object make(T&&... args)
>> {
>> log(args...);
>>
>> return Object(std::forward<T>(args)...);
>> }
>>
>> This works as per current rules.
>>
>>
>> *However* we could improve the rules to create a pass-trough
>>
>> template<class T>
>> decltype(auto) log(T&& a)
>> {
>> std::count << a;
>>
>> return std::forward<T>(a);
>> }
>>
>> If we return a (possibly annotated) forward, and the return type is
>> deduced (or we invent a attribute for that), then the call of the function
>> is annotated instead.
>>
>> Object(log(std::forward<T>(args))...);
>>
>> // generates
>> // => Object(foo: log(foo: something));
>>
>>
> When the rules are getting this complicated, you need to take a step back
> and ask "if it requires all of this complexity, is this *really* a good
> idea?" Bulldozer design of this type has a tendency to work out poorly and
> inflexibly. See the Coroutines TS.
>
> Not to mention the fact that now you're telling people to write their code
> in a completely different way just to make logging *continue* working
> correctly. It seems wrongheaded to tell other people to change their code
> from the more natural syntax just to appease your new feature.
>
You either support named arguments or you don't. If your library does not
support named arguments, the users will not be using named arguments with
your library.
Once the library is updated, be it by adding names or adjusting some code
if needed, then the users can use names.
About pass-through, it all depends if *we* decide it is a good idea.
>
> ...
>>>
>>> In fact, I just realized that `std::forward` *itself* wouldn't work,
>>> since its argument does not have the corresponding name. So how can you
>>> call it with a named parameter?
>>>
>>> And if you special-case this as some magical property of
>>> `std::forward`... what happens if people use the equivalent `static_cast`?
>>> Or is that special-cased as well?
>>>
>>
>>
>> We can declare reference collapsing actually forces the compiler to add
>> annotation, then use the above new rule to create std::forward itself.
>>
>
> So, what about `forward_as_tuple` and `std::apply`? We ought to be able to
> pass named parameters through `std::async` and similar functions, right?
>
Out of question. Names are either direct call or forwarding reference call
where the compiler is our friend. If one passes names to async it will
error out when they are forwarded to the thread.
And no need to go to thread and tuple, even function pointers don't have
names and error out.
> If this is going to work, you need to lay down *exactly* what the rules
>>> are for this forwarding of named parameters.
>>>
>>
>> Absolutely. But it is very important both to be errors and to work with
>> it.
>>
>
> You have that backwards. If the rules don't allow them to be errors
> without breaking something, then they can't be errors. You need to make
> sure that a set of rules *can* be established before you can say that
> name mismatches must be errors.
>
In many places it is an error to pass a name, not because there is a
mismatch, but because this is not supported.
And as Henry Miller argued - better to not support them in some places then
to silently ignore them!
> To work is important, because this is standard and recommended way of
>> creating objects, not just some minor library helper.
>>
>
>> To be an error is important because A) It is breach of contract in
>> basically all cases to get the arguments wrong.
>>
>
> The "contract" in C++ function calls is defined by our strong typing
> system. A contract is violated when you provide incorrect types to a
> function. This means that the contract visible at all levels of the code.
> If you're in function A, and you call function B which passes your
> parameters to function C, then we can see that.
>
> If you want name mismatches to always be a "breach of contract", then that
> contract needs to be part of the actual type system *at all levels*, not
> some external channel of information that insinuates itself magically via
> unknown means. If it's important enough to truly be part of the "contract"
> of a function, then it's important enough for the name to be *required*,
> not optional.
>
>
Incorrect argument places *is *breach of contract. Can we do this using
types *on any scale* - no. A math library or a physics library, written by
physicists-that-know-how-to-program, will *never* go all types.
It is not practical, probably nice, but not practical and is not always
semantically sane to say the least. Yet, passing n into k is breach of
contract we don't land on Mars.
Should names travel across all wrappers, absolutely, if we can do that. But
we can't. We do as best we can. 90% of people that need named arguments are
happy with just direct function call support anyway.
We simply need to decide where to draw the line.
> If all the name is for is to visually indicate something, on the level of
> a comment, then building a system of rules making it an error is wrong.
>
> B) Nowadays we have very aggressive static analyses which are great but
>> tend to generate false positives - warnings might go unnoticed.
>>
>
> P0671's rules for it wouldn't generate false positives; it generates false
> negatives: places where there is a mismatch, but the compiler doesn't see
> it.
>
Then it is worse then I thought. One is better of with comments then, at
least there is no false sense of security.
> About macros. I believe names will not break on user-defined macros,
>> because the compiler should not look for macros when he sees something:
>>
>
> That's not how the preprocessor works. `something:` is an identifier token
> followed by a `:` token. If that identifier token names a macro, then the
> preprocessor *will* convert it into something else.
>
> This feature is not important enough to go changing the
> preprocessor/tokenizer. Especially since that would break labels.
>
Well, one more argument to have names just on few selected arguments, when
it comes to the standard library. They will be part of the standard and the
user will have to deal with 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/a3b4568e-0d7c-4b43-93ab-d30f2c5ff838%40isocpp.org.
------=_Part_379_169144615.1533234302978
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:21:12 PM UTC+3, N=
icol Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"l=
tr">On Thursday, August 2, 2018 at 9:49:19 AM UTC-4, <a>mihailn...@gmail.co=
m</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">On Thu=
rsday, August 2, 2018 at 3:46:32 AM UTC+3, Nicol Bolas wrote:<blockquote cl=
ass=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #cc=
c solid;padding-left:1ex"><div dir=3D"ltr">On Wednesday, August 1, 2018 at =
6:02:28 PM UTC-4, <a>mihailn...@gmail.com</a> wrote:<blockquote class=3D"gm=
ail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;p=
adding-left:1ex"><div dir=3D"ltr"><div>Nicol, the most important difference=
is the fact, names are different from arguments - this <i>radically</i> im=
proves the expressiveness of names (names like 'equalTo', 'with=
', 'including', 'forValue'=C2=A0 become feasible) and f=
rees the library developer to use and change the arguments at any time.</di=
v><div><br></div><div>Also, wrong names are errors, not a warnings.=C2=A0</=
div><div>About forwarding, we formerly must handle the case as the implemen=
tation must know against which call to check the name. I see forwarding as =
pretty much a must, considering we want to make_objects and constructors ar=
e number one client of named arguments.<br></div></div></blockquote><div><b=
r></div><div>And that's exactly why it should be a warning, not an erro=
r. Because you're not going to <i>always</i> be able to tell.</div><div=
><br></div><div>Let's say you have your own `make_` function, but it lo=
gs the arguments with something like `(log(std::forward<Args>(args)<w=
br>), ...)` before calling the constructor. That means you're going to =
forward each parameter to a function. That function will be overloaded on e=
ach supported type to extract the value for the logging operation (perhaps =
with some template default). So... how does that work?</div></div></blockqu=
ote><div><br></div><div><br></div><div>There are few ways around this</div>=
<div><br></div><div><font face=3D"courier new,monospace">template<class.=
... T><br>Object make(T&&... args)<br>{<br><div>=C2=A0 =C2=A0 log=
(args...);</div><div><br></div>=C2=A0=C2=A0=C2=A0 return Object(std::forwar=
d<T>(args)..<wbr>.);<br>}</font><br></div><div><font face=3D"courier =
new,monospace"></font><br></div><div>This works as per current rules.</div>=
<div><br></div><div><br></div><div><i>However</i> we could improve the rule=
s to create a pass-trough</div><div><br></div><div><font face=3D"courier ne=
w,monospace">template<class T><br>decltype(auto) log(T&& a)=
=C2=A0<br>{<br><div>=C2=A0=C2=A0=C2=A0 std::count << a;</div><div><br=
></div>=C2=A0=C2=A0=C2=A0 return std::forward<T>(a);=C2=A0<br>}</font=
><br></div><div><br></div><div>If we return a (possibly annotated) forward,=
and the return type is deduced (or we invent a attribute for that), then t=
he call of the function is annotated instead.</div><div><br></div><div><spa=
n 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-decoration:none;text-indent:0px;text-transform:none;white-=
space:normal;word-spacing:0px">Object(log(std::forward<T>(<wbr>args))=
....);</span><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br=
></div><div><font face=3D"courier new,monospace"></font><br></div><div><fon=
t face=3D"courier new,monospace">// generates</font></div><div><font face=
=3D"courier new,monospace">// =3D> Object(foo: log(foo: something));</fo=
nt></div><div><font face=3D"courier new,monospace"><br></font></div></div><=
/blockquote><div><br></div><div>When the rules are getting this complicated=
, you need to take a step back and ask "if it requires all of this com=
plexity, is this <i>really</i> a good idea?" Bulldozer design of this =
type has a tendency to work out poorly and inflexibly. See the Coroutines T=
S.</div><div><br></div><div></div><div>Not to mention the fact that now you=
're telling people to write their code in a completely different way ju=
st to make logging <i>continue</i> working correctly. It seems wrongheaded =
to tell other people to change their code from the more natural syntax just=
to appease your new feature.</div></div></blockquote><div><br></div><div>Y=
ou either support named arguments or you don't. If your library does no=
t support named arguments, the users will not be using named arguments with=
your library. <br>Once the library is updated, be it by adding names or ad=
justing some code if needed, then the users can use names. </div><div><br><=
/div><div>About pass-through, it all depends if <i>we</i> decide it is a go=
od idea. <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><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><font face=3D"courier new,monospace"></font></div>=
<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;borde=
r-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><font face=3D=
"courier new,monospace"></font></div><div>...</div><div><br></div><div>In f=
act, I just realized that `std::forward` <i>itself</i> wouldn't work, s=
ince its argument does not have the corresponding name. So how can you call=
it with a named parameter?</div><div><br></div><div>And if you special-cas=
e this as some magical property of `std::forward`... what happens if people=
use the equivalent `static_cast`? Or is that special-cased as well?<br></d=
iv></div></blockquote><div><br></div><div><br></div><div>We can declare ref=
erence collapsing actually forces the compiler to add annotation, then use =
the above new rule to create std::forward itself.</div></div></blockquote><=
div></div><div><div><br></div>So, what about `forward_as_tuple` and
`std::apply`? We ought to be able to pass named parameters through=20
`std::async` and similar functions, right?</div></div></blockquote><div><br=
></div><div><br></div><div>Out of question. Names are either direct call or=
forwarding reference call where the compiler is our friend. If one passes =
names to async it will error out when they are forwarded to the thread.</di=
v><div><br></div><div>And no need to go to thread and tuple, even function =
pointers don't have names and error out.</div><div><br></div><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><br></div><blockqu=
ote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1=
px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><blockquote cla=
ss=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></div><div>If thi=
s is going to work, you need to lay down <i>exactly</i> what the rules are =
for this forwarding of named parameters.</div></div></blockquote><div><br><=
/div><div>Absolutely. But it is very important both to be errors and to wor=
k with it.</div></div></blockquote><div><br></div><div>You have that backwa=
rds. If the rules don't allow them to be errors without breaking someth=
ing, then they can't be errors. You need to make sure that a set of rul=
es <i>can</i> be established before you can say that name mismatches must b=
e errors.</div></div></blockquote><div><br></div><div>=C2=A0In many places =
it is an error to pass a name, not because there is a mismatch, but because=
this is not supported.=C2=A0</div><div>And as Henry Miller argued - better=
to not support them in some places then to silently ignore them!</div><div=
><br></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><blockquote class=3D"gmail_quote" style=3D"marg=
in:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div di=
r=3D"ltr"><div>To work is important, because this is standard and recommend=
ed way of creating objects, not just some minor library helper.</div></div>=
</blockquote><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px =
0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><br></d=
iv></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"><d=
iv></div><div>To be an error is important because A) It is breach of contra=
ct in basically all cases to get the arguments wrong.</div></div></blockquo=
te><div><br></div><div>The "contract" in C++ function calls is de=
fined by our strong typing system. A contract is violated when you provide =
incorrect types to a function. This means that the contract visible at all =
levels of the code. If you're in function A, and you call function B wh=
ich passes your parameters to function C, then we can see that.</div><div><=
br></div><div></div><div>If you want name mismatches to always be a "b=
reach of contract", then that contract needs to be part of the actual =
type system <i>at all levels</i>, not some external channel of information =
that insinuates itself magically via unknown means. If it's important e=
nough to truly be part of the "contract" of a function, then it&#=
39;s important enough for the name to be <i>required</i>, not optional.</di=
v><div><br></div></div></blockquote><div><br></div><div>Incorrect argument =
places <i>is </i>breach of contract. Can we do this using types <i>on any s=
cale</i> - no. A math library or a physics library, written by physicists-t=
hat-know-how-to-program, will <i>never</i> go all types. <br>It is not prac=
tical, probably nice, but not practical and is not always semantically sane=
to say the least. Yet, passing n into k is breach of contract we don't=
land on Mars. <br><br></div><div>Should names travel across all wrappers, =
absolutely, if we can do that. But we can't. We do as best we can. 90% =
of people that need named arguments are happy with just direct function cal=
l support anyway.</div><div>We simply need to decide where to draw the line=
..</div><div><br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" st=
yle=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-lef=
t: 1ex;"><div dir=3D"ltr"><div></div><div>If all the name is for is to visu=
ally indicate something, on the level of a comment, then building a system =
of rules making it an error is wrong.<br></div><div><br></div><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>B) Nowadays we have very a=
ggressive static analyses which are great but tend to generate false positi=
ves - warnings might go unnoticed.<br></div></div></blockquote><div><br></d=
iv></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>P0671's rules for it wouldn't generate fal=
se positives; it generates false negatives: places where there is a mismatc=
h, but the compiler doesn't see it.<br></div></div></blockquote><div><b=
r></div><div><br></div><div>Then it is worse then I thought. One is better =
of with comments then, at least there is no false sense of security.=C2=A0<=
/div><div>=C2=A0</div><div><br></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></div><div><br></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></div><div>About macros. I =
believe names will not break on user-defined macros, because the compiler s=
hould not look for macros when he sees <font face=3D"courier new,monospace"=
>something:</font></div></div></blockquote><div><br></div><div>That's n=
ot how the preprocessor works. `something:` is an identifier token followed=
by a `:` token. If that identifier token names a macro, then the preproces=
sor <i>will</i> convert it into something else.</div><div><br></div><div>Th=
is feature is not important enough to go changing the preprocessor/tokenize=
r. Especially since that would break labels.<br></div></div></blockquote><d=
iv><br></div><div><br></div><div>Well, one more argument to have names just=
on few selected arguments, when it comes to the standard library. They wil=
l be part of the standard and the user will have to deal with it.</div></di=
v>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/a3b4568e-0d7c-4b43-93ab-d30f2c5ff838%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/a3b4568e-0d7c-4b43-93ab-d30f2c5ff838=
%40isocpp.org</a>.<br />
------=_Part_379_169144615.1533234302978--
------=_Part_378_175156957.1533234302978--
.
Author: schreiber.corentin@gmail.com
Date: Thu, 2 Aug 2018 14:40:12 -0700 (PDT)
Raw View
------=_Part_434_330221328.1533246012856
Content-Type: multipart/alternative;
boundary="----=_Part_435_278927479.1533246012857"
------=_Part_435_278927479.1533246012857
Content-Type: text/plain; charset="UTF-8"
On Monday, July 30, 2018 at 7:58:25 PM UTC+1, mihailn...@gmail.com wrote:
>
> It is an error to pass a name to an argument that it is not declared to
> have name.
>
> void func(int arg);
>
> // user
>
> func(arg: 5); //< error
>
> There is one exception. If, and only if, the argument is forwarding
> reference *and* it is forwarded,
> then the forwarding function is allowed to be called with an argument
> name, even if one is not declared for that argument.
>
> 5. Because names are purely compile time, and perfect forwarding is always
> inline, names are able to change call sites.
>
> This is done by the compiler alone, by prepending calls to std::forward
> with the name, used on the forwarded argument, for the call of the
> enclosing function.
>
> void func(int& foo: arg);
>
> template<class T>
> void fwdfunc(T&& arg) *//< no name for the argument*
> {
> func(std::forward<T>(arg));
> }
>
> // user
>
> int val = 5;
> fwdfunc(foo: val) *//< allowed*
>
> // generates
>
> void fwdfunc(int& && arg)
> {
> func(std::forward<int&>(arg));
> *// => func(foo: std::forward<int&>(arg))*
> *// => func(foo: int&)*
> }
>
> If the forwarding function declares a name for that argument, the user
> specified name is checked against that name instead and std::forward is
> called normally.
>
I agree with Nicol that creating special rules just for forwarding (and
making std::forward<> a special case) feels like the wrong approach. Fixing
the problem of forwarding is important though, and it may require some more
work... Perhaps a more generic mechanism. For example you could think of
allowing parameter names to be templated string constants:
template<constexpr_string N>
void foo(int N : param) {
log(param);
bar(N : param);
bob(value : param);
}
This would effectively create a function foo() that accepts any name for
its first argument. It can then forward that name to bar(), or use no name
at all for the debugging log() function, or use a different name when
calling bob(). This may seem to contradict the rule that a function can
only have one name defined for its parameter, unless you see foo<"mother">
and foo<"width"> as different functions (which they are). The perfect
forwarding idiom then becomes:
template<typename T, constexpr_string N>
void foo(T&& N : param) {
bar(N : std::forward<T>(param));
}
Of course, that becomes close to making names part of the type system in
some sense. But indeed I'm not sure there's a way to implement forwarding
without 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/b4a05f8e-c713-4b1f-b56f-f0a62b4e4a28%40isocpp.org.
------=_Part_435_278927479.1533246012857
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Monday, July 30, 2018 at 7:58:25 PM UTC+1, mihailn...@g=
mail.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=
"><div>It is an error to pass a name to an argument that it is not declared=
to have name.</div><div><br></div><div><font style=3D"border-color: rgb(34=
, 34, 34); border-style: none;" face=3D"courier new,monospace">void func(in=
t arg);</font></div><div><br></div><div><font face=3D"courier new,monospace=
">// user</font></div><div><br></div><div><font face=3D"courier new,monospa=
ce">func(arg: 5); //< error</font></div><div><br></div><div>There is one=
exception. If, and only if, the argument is forwarding reference <i>and</i=
> it<span style=3D"background-color: transparent; font-variant-numeric: nor=
mal; font-variant-east-asian: normal;"> is forwarded,</span></div><div><spa=
n style=3D"background-color: transparent; font-variant-numeric: normal; fon=
t-variant-east-asian: normal;">then the forwarding function is allowed to b=
e called with an argument name, even if one is not declared for that argume=
nt.<br><br></span><div>5. Because names are purely compile time, and perfec=
t forwarding is always inline, names are able to change call sites.</div><d=
iv><br></div><div>This is done by the compiler alone, by prepending calls t=
o <font face=3D"courier new,monospace">std::forward</font> with the name, u=
sed on the forwarded argument, for the call of the enclosing function.</div=
><div><br></div><div><span style=3D"font-variant-numeric: normal; font-vari=
ant-east-asian: normal; background-color: transparent;"><font face=3D"couri=
er new,monospace">void func(int& foo: arg);</font></span><br></div><div=
><br></div><div><font face=3D"courier new,monospace">template<class T>=
;</font></div><div><font face=3D"courier new,monospace">void fwdfunc(T&=
& arg) <i>//< no name for the argument</i></font></div><div><font fa=
ce=3D"courier new,monospace">{ =C2=A0</font></div><div><font face=3D"courie=
r new,monospace">=C2=A0 func(std::forward<T>(arg));</font></div><div>=
<font face=3D"courier new,monospace">}</font></div><div><br></div><div><fon=
t face=3D"courier new,monospace">// user</font></div><div><br></div><div><f=
ont face=3D"courier new,monospace">int val =3D 5;</font></div><div><span st=
yle=3D"font-variant-numeric: normal; font-variant-east-asian: normal; backg=
round-color: transparent;"><font face=3D"courier new,monospace">fwdfunc(foo=
: val) <i>//< allowed</i></font></span></div><div><br></div><div><font f=
ace=3D"courier new,monospace">// generates</font></div><div><br></div><div>=
<font style=3D"border-color: rgb(34, 34, 34); border-style: none;" face=3D"=
courier new,monospace">void fwdfunc(int& && arg)=C2=A0</font></=
div><div><font style=3D"border-color: rgb(34, 34, 34); border-style: none;"=
face=3D"courier new,monospace">{ =C2=A0</font></div><div><font style=3D"bo=
rder-color: rgb(34, 34, 34); border-style: none;" face=3D"courier new,monos=
pace">=C2=A0 func(std::forward<<span style=3D"background-color: transpar=
ent; font-variant-numeric: normal; font-variant-east-asian: normal;">int&am=
p;</span>>(arg));<wbr>=C2=A0</font></div><div style=3D"border-color: rgb=
(34, 34, 34); font-variant-numeric: normal; font-variant-east-asian: normal=
; background-color: transparent;"><font style=3D"border-color: rgb(34, 34, =
34); border-style: none;" face=3D"courier new,monospace"><i>// =3D>=C2=
=A0 func(foo: <span style=3D"font-variant-numeric: normal; font-variant-eas=
t-asian: normal; background-color: transparent;">std::forward<<span styl=
e=3D"font-variant-numeric: normal; font-variant-east-asian: normal; backgro=
und-color: transparent;">int&</span>>(arg)</span>)</i></font></div><=
div style=3D"border-color: rgb(34, 34, 34); font-variant-numeric: normal; f=
ont-variant-east-asian: normal; background-color: transparent;"><font style=
=3D"border-color: rgb(34, 34, 34); border-style: none;"><font face=3D"couri=
er new,monospace"><i>// =3D>=C2=A0 <span style=3D"font-variant-numeric: =
normal; font-variant-east-asian: normal; background-color: transparent;">fu=
nc(foo: </span><span style=3D"border-color: rgb(34, 34, 34); font-variant-n=
umeric: normal; font-variant-east-asian: normal; background-color: transpar=
ent;">int&</span><span style=3D"font-variant-numeric: normal; font-vari=
ant-east-asian: normal; background-color: transparent;">)</span></i></font>=
</font></div><div><font style=3D"border-color: rgb(34, 34, 34); border-styl=
e: none;" face=3D"courier new,monospace">}</font></div><div><font style=3D"=
border-color: rgb(34, 34, 34); border-style: none;" face=3D"courier new,mon=
ospace"><br></font></div><div><font style=3D"border-color: rgb(34, 34, 34);=
border-style: none;" face=3D"arial,sans-serif">If the forwarding function =
declares a name for that argument, the user specified name is checked again=
st that name instead and <span style=3D"background-color: transparent; font=
-family: Arial, Helvetica, sans-serif; font-variant-numeric: normal; font-v=
ariant-east-asian: normal;">std::forward is called normally.</span></font><=
/div></div></div></blockquote><div>=C2=A0</div><div>I
agree with Nicol that creating special rules just for forwarding (and=20
making std::forward<> a special case) feels like the wrong=20
approach. Fixing the problem of forwarding is important though, and it=20
may require some more work... Perhaps a more generic mechanism. For=20
example you could think of allowing=20
parameter names to be templated string constants:</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-wor=
d;" class=3D"prettyprint"><code class=3D"prettyprint"><div class=3D"subpret=
typrint"><span style=3D"color: #008;" class=3D"styled-by-prettify">template=
</span><span style=3D"color: #660;" class=3D"styled-by-prettify"><</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify">constexpr_string=
N</span><span style=3D"color: #660;" class=3D"styled-by-prettify">></sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><sp=
an style=3D"color: #008;" class=3D"styled-by-prettify">void</span><span sty=
le=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: #0=
08;" class=3D"styled-by-prettify">int</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify"> N </span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">:</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"> param</span><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify">)</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> <=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">{</span><sp=
an style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 =C2=A0 lo=
g</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify">param</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 bar</span><sp=
an style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify">N </span><span style=3D"colo=
r: #660;" class=3D"styled-by-prettify">:</span><span style=3D"color: #000;"=
class=3D"styled-by-prettify"> param</span><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">);</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"><br>=C2=A0 =C2=A0 bob</span><span style=3D"color: #660;" =
class=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=3D"=
styled-by-prettify">value </span><span style=3D"color: #660;" class=3D"styl=
ed-by-prettify">:</span><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify"> param</span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">);</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br><=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">}</span><sp=
an style=3D"color: #000;" class=3D"styled-by-prettify"><br></span></div></c=
ode></div><br>This
would effectively create a function foo() that accepts any name for its
first argument. It can then forward that name to bar(), or use no name=20
at all for the=20
debugging log() function, or use a different name when calling bob().=20
This may seem to contradict the rule that a function can only have one=20
name defined for its parameter, unless you see foo<"mother">=
; and=20
foo<"width"> as different functions (which they are). The p=
erfect=20
forwarding idiom then=20
becomes: <br></div><div><br></div><div><div style=3D"background-color: rgb(=
250, 250, 250); border-color: rgb(187, 187, 187); border-style: solid; bord=
er-width: 1px; overflow-wrap: break-word;" class=3D"prettyprint"><code clas=
s=3D"prettyprint"><span style=3D"color: #000;" class=3D"styled-by-prettify"=
>template<typename T, constexpr_string N><br>void foo(T&& N :=
param) {<br>=C2=A0 =C2=A0 bar(N : std::forward<T>(param));<br>}</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"></span></code><=
/div><br></div>Of
course, that becomes close to making names part of the type system in=20
some sense. But indeed I'm not sure there's a way to implement=20
forwarding without it.<br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/b4a05f8e-c713-4b1f-b56f-f0a62b4e4a28%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/b4a05f8e-c713-4b1f-b56f-f0a62b4e4a28=
%40isocpp.org</a>.<br />
------=_Part_435_278927479.1533246012857--
------=_Part_434_330221328.1533246012856--
.