How would you do this in D?
Jens Mueller
jens.k.mueller at gmx.de
Wed May 11 02:35:46 PDT 2011
Jonathan M Davis wrote:
> On 2011-05-10 18:06, Jose Armando Garcia wrote:
> > Thanks. I should have read
> > http://www.digitalmars.com/d/2.0/template.html more carefully.
> >
> > "Multiple instantiations of a TemplateDeclaration with the same
> > TemplateArgumentList, before implicit conversions, all will refer to
> > the same instantiation."
> >
> > The default values which are evaluated at the call site are part of
> > the TemplateArgumentList.
>
> Yes, default arguments are evaluated at the call site, not where the code is
> declared. I believe that C++ has the opposite behavior, so it's not uncommon
> that people miss that. It's _very_ useful though - particularly when dealing
> with __FILE__ and __LINE__.
I did some little testing (see attached file). The bar() example shows
that default arguments are evaluated at call site (even in C++). If it
was only evaluated when declared it would always return 1.
But __LINE__ does not work as in D. I believe that is due to __LINE__
being a macro in C whereas in D it is evaluated at instantiation time
(i.e. it is not text replacement). So it seems that instantiation of
default arguments is the same in D and C++. The difference is that
__LINE__ and __FILE__ are different things in C++ and D. In C++ there is
no such thing as evaluating __LINE__. Or let's say they are constant
expressions (due to textual replacement) where in D they are evaluated
differently depending on the context.
Does this make sense?
Jens
-------------- next part --------------
#include <cstddef>
#include <assert.h>
size_t inc() {
static size_t val = 0;
++val;
return val;
}
size_t bar(size_t num = inc()) {
return num;
}
size_t line(size_t line = __LINE__) {
return line;
}
int main() {
int num = bar();
assert(num == 1);
num = bar();
assert(num == 2);
num = bar();
num = bar();
num = bar();
assert(num == 5);
// fails
// I believe because __LINE__ is just a macro
assert(line() == __LINE__);
return 0;
}
More information about the Digitalmars-d
mailing list