D equivalent of C++11's function local static initialization?

Ola Fosheim Grøstad via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed May 17 00:25:01 PDT 2017


On Wednesday, 17 May 2017 at 07:08:07 UTC, bauss wrote:
> On Wednesday, 17 May 2017 at 03:08:39 UTC, Timothee Cour wrote:
>> NOTE: curious about both cases:
>> * thread local
>> * shared
>>
>> On Tue, May 16, 2017 at 8:04 PM, Timothee Cour 
>> <thelastmammoth at gmail.com> wrote:
>>> what's the best D equivalent of C++11's function local static 
>>> initialization?
>>> ```
>>> void fun(){
>>>   static auto a=[](){
>>>     //some code
>>>    return some_var;
>>>   }
>>> }
>>> ```
>>>
>>> (C++11 guarantees thread safety)
>
> I don't know the exact equivalent, mostly because I don't 
> really know what the C++ statement does tbh. Tried to look it 
> up real quick, but can't seem to find anything actual 
> information on it.

It initializes a global variable "a" once from an unnamed class 
object with a "opCall" style method on it.

Lambdas in C++ are regular objects with some syntactical sugar 
over it.

http://en.cppreference.com/w/cpp/language/storage_duration#Static_local_variables

«If multiple threads attempt to initialize the same static local 
variable concurrently, the initialization occurs exactly once 
(similar behavior can be obtained for arbitrary functions with 
std::call_once).
Note: usual implementations of this feature use variants of the 
double-checked locking pattern, which reduces runtime overhead 
for already-initialized local statics to a single non-atomic 
boolean comparison.»



More information about the Digitalmars-d-learn mailing list