Different visibility in template for class and struct?
    Steven Schveighoffer 
    schveiguy at gmail.com
       
    Mon May 11 15:29:53 UTC 2020
    
    
  
On 5/11/20 11:11 AM, Shigeki Karita wrote:
> Why is local struct visible in this outer template, while local class is 
> not?
> 
> https://wandbox.org/permlink/MfsDa68qgaMSIr4a
> 
> https://dlang.org/spec/template.html#instantiation_scope
> 
> ---
> 
> enum p(T) = __traits(compiles, new T());
> 
> class GlobalC {}
> struct GlobalS {}
> 
> void main()
> {
>      class LocalC {}
>      static assert(p!GlobalC);
>      static assert(!p!LocalC);
> 
>      struct LocalS {}
>      static assert(p!GlobalS);
>      static assert(p!LocalS); // ??
> }
> 
First, it actually does compile, I think because the compiler recognizes 
that LocalS is POD (plain old data), without methods, so it doesn't need 
a context pointer.
e.g.:
auto make(T)() { return new T(); }
...
auto x = make!LocalS; // ok
If you add a method to LocalS, then make!LocalS fails to compile. 
However, strangely, p!LocalS still returns true, I think that is an error.
-Steve
    
    
More information about the Digitalmars-d-learn
mailing list