Jérôme M. Berger Wrote: > bearophile wrote: > > I have found this page linked from Reddit (click "Toggle all summaries" at > > the top to read the full page): > > http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml > > > > At Google C++ isn't the most used language, so it may be better to use a > > C++ style guide from a firm that uses C++ more than Google. On the other > > hand Google has hired many good programmers, and probably some of them have > > strong C++ experience, so if you are interested in C++/D this style guide > > deserves to be read. > > > > This guide is mostly (as it often happens with C++) a list of features that > > are forbidden, I think usually to reduce the total bug count of the > > programs. Some of such imposed limits make me a little nervous, so I'd like > > to remove/relax some of those limits, but I am ignorant regarding C++, > > while the people that have written this document are expert, so their > > judgement has weight. > > > > They forbid several features that are present in D too. Does it means D has > > to drop such features (or make them less "natural", so the syntax > > discourages their use)? > > > > Here are few things from that document that I think are somehow > > interesting. Some of those things may be added to D style guide, or they > > may even suggest changes in the language itself. > > > > ------------------- > > > >> Function Parameter Ordering: When defining a function, parameter order is: > >> inputs, then outputs.< > > > > D may even enforce this, allowing "out" only after "in" arguments. > > > I actually use the inverse convention: "out" arguments come first. > This way, it is easy to see that "a = b" and "assign (a, b)" modify > "a" and not "b". > > Jerome
Ditto. A special use case to consider is when you have a function template that returns a type that is a template parameter and the types of the function arguments are also template parameters. Often type inference can be used to determine the type of the function arguments without explicit qualification of the argument types in the instantiation. The return type must be specified however, since inference cannot be made from missing information. This suggests a natural order that results (and out arguments) should be on the LHS and (in) arguments on the RHS. So if one writes this: R Foo(R, A1, A2)( A1 arg1, A2 arg2) { R r; return r; } auto r = Foo!(double)( 3, 4); Isn't it more natural or consistent to write this also: void Bar(R, A1, A2)( out R r, A1 arg1, A2 arg2) { } double r; Bar!(double)( 3, 4); I haven't tried it so not sure if this works but you get the idea. Another reason why outs/inouts should be before in arguments is in the case of functions taking variable length argument lists or variadic arguments. Normally there is only one output argument but there is an arbitrary number of input arguments that the function can take. Yet another reason why so is by analogy with output stream functions; an output stream argument is analogous to an output value or reference. Nearly all I/O libraries that I've seen have usage like this: fprintf( stdout, /+args...+/); write( os, value); Rarely the other way around, namely, input arguments before output stream/file channel argument. -- Justin Johansson