www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - function pointer and default argument

reply Ellery Newcomer <ellery-newcomer utulsa.edu> writes:
hey.

is this valid code?

void func1(int i, double j = 1.0) {
}

void main() {
     auto fn = &func1;
     func1(1); //dmd: ok
     fn(1); // dmd: not ok
}
Aug 22 2012
next sibling parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 08/22/2012 11:51 AM, Ellery Newcomer wrote:
 hey.

 is this valid code?

 void func1(int i, double j = 1.0) {
 }

 void main() {
 auto fn = &func1;
 func1(1); //dmd: ok
 fn(1); // dmd: not ok
 }

The type of the function pointer does not include the values of the default parameters. The type of fn is "a function taking int and a double, returning nothing". So the compiler must require that information at the call site. The alternative could work too: The compiler could keep a table from function pointers to default parameters. But that would be slow. I am not surprised by dmd's behavior. Ali
Aug 22 2012
parent reply Ellery Newcomer <ellery-newcomer utulsa.edu> writes:
On 08/22/2012 12:03 PM, Ali Çehreli wrote:
 On 08/22/2012 11:51 AM, Ellery Newcomer wrote:
  > hey.
  >
  > is this valid code?
  >
  > void func1(int i, double j = 1.0) {
  > }
  >
  > void main() {
  > auto fn = &func1;
  > func1(1); //dmd: ok
  > fn(1); // dmd: not ok
  > }

 The type of the function pointer does not include the values of the
 default parameters.

typeof lies. pragma(msg, typeof(fn));
 void function(int i, double j = 1)

Aug 22 2012
parent =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 08/22/2012 12:15 PM, Ellery Newcomer wrote:
 On 08/22/2012 12:03 PM, Ali Çehreli wrote:
 On 08/22/2012 11:51 AM, Ellery Newcomer wrote:
 hey.

 is this valid code?

 void func1(int i, double j = 1.0) {
 }

 void main() {
 auto fn = &func1;
 func1(1); //dmd: ok
 fn(1); // dmd: not ok
 }

The type of the function pointer does not include the values of the default parameters.

typeof lies. pragma(msg, typeof(fn)); > void function(int i, double j = 1)

Opened: http://d.puremagic.com/issues/show_bug.cgi?id=8579 Ali
Aug 22 2012
prev sibling parent "Jonathan M Davis" <jmdavisProg gmx.com> writes:
On Wednesday, August 22, 2012 11:51:45 Ellery Newcomer wrote:
 hey.
 
 is this valid code?
 
 void func1(int i, double j = 1.0) {
 }
 
 void main() {
 auto fn = &func1;
 func1(1); //dmd: ok
 fn(1); // dmd: not ok
 }

Default arguments are not part of the type. This behavior is very much on purpose. http://d.puremagic.com/issues/show_bug.cgi?id=3866 http://d.puremagic.com/issues/show_bug.cgi?id=8402 http://d.puremagic.com/issues/show_bug.cgi?id=8515 - Jonathan M Davis
Aug 22 2012