is(T == const) for function types

mist none at none.none
Wed Dec 26 10:05:37 PST 2012


On Wednesday, 26 December 2012 at 00:47:28 UTC, Ali Çehreli wrote:
> On 12/25/2012 04:13 PM, bearophile wrote:
>> Ali Çehreli:
>>
>>> I don't know the answer but this works:
>>
>> That difference smells of compiler bug :-)
>>
>> Bye,
>> bearophilee
>
> Hmmm. I think the compiler is right. That const that is applied 
> "at the end" in that syntax is I think allowed only for member 
> functions. Otherwise these two work as well:
>
>     // These work:
>     const(void delegate()) deleg;
>     const void delegate() deleg;
>
>     // This is a compilation error:
>     void delegate() const deleg;
>
>
> Ali

Yes, looks like I was not checking 
http://dlang.org/declaration.html good enough and assumed C-like 
model where "Type const var" is as legal as "const Type var". 
There is a surprising revelation provided by Kenji in context of 
member variable delegates:

struct Test
{
	void delegate() const deleg;
}

void main()
{
	static if (is(typeof(Test.deleg) F == delegate))
	{
		pragma(msg, "Sure, delegate");
		static assert( is(F == const) );
	}
}

"Delegate type qualifier cannot test directly. You should extract 
function type from it, then test const." (c) Kenji

Copying it here from github for any possible lucky googlers :)


More information about the Digitalmars-d-learn mailing list