View source code
Display the source code in std/conv.d from which this page was generated on github.
Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using local clone.

std.conv.emplace - multiple declarations

Function emplace

Given a pointer chunk to uninitialized memory (but already typed as T), constructs an object of non-class type T at that address. If T is a class, initializes the class reference to null.

T* emplace(T) (
  T* chunk
) pure nothrow @safe;

Returns

A pointer to the newly constructed object (which is the same as chunk).

Example

static struct S
{
    int i = 42;
}
S[2] s2 = void;
emplace(&s2);
assert(s2[0].i == 42 && s2[1].i == 42);

Example

interface I {}
class K : I {}

K k = void;
emplace(&k);
assert(k is null);

I i = void;
emplace(&i);
assert(i is null);

Function emplace

Given a pointer chunk to uninitialized memory (but already typed as a non-class type T), constructs an object of type T at that address from arguments args. If T is a class, initializes the class reference to args[0].

T* emplace(T, Args...) (
  T* chunk,
  auto ref Args args
)
if (is(T == struct) || Args.length == 1);

This function can be @trusted if the corresponding constructor of T is @safe.

Returns

A pointer to the newly constructed object (which is the same as chunk).

Example

int a;
int b = 42;
writeln(*emplace!int(&a, b)); // 42

Function emplace

Given a raw memory area chunk (but already typed as a class type T), constructs an object of class type T at that address. The constructor is passed the arguments Args.

T emplace(T, Args...) (
  T chunk,
  auto ref Args args
)
if (is(T == class));

If T is an inner class whose outer field can be used to access an instance of the enclosing class, then Args must not be empty, and the first member of it must be a valid initializer for that outer field. Correct initialization of this field is essential to access members of the outer class inside T methods.

Note

This function is @safe if the corresponding constructor of T is @safe.

Returns

The newly constructed object.

Example

() @safe {
    class SafeClass
    {
        int x;
        @safe this(int x) { this.x = x; }
    }

    auto buf = new void[__traits(classInstanceSize, SafeClass)];
    auto support = (() @trusted => cast(SafeClass)(buf.ptr))();
    auto safeClass = emplace!SafeClass(support, 5);
    writeln(safeClass.x); // 5

    class UnsafeClass
    {
        int x;
        @system this(int x) { this.x = x; }
    }

    auto buf2 = new void[__traits(classInstanceSize, UnsafeClass)];
    auto support2 = (() @trusted => cast(UnsafeClass)(buf2.ptr))();
    static assert(!__traits(compiles, emplace!UnsafeClass(support2, 5)));
    static assert(!__traits(compiles, emplace!UnsafeClass(buf2, 5)));
}();

Function emplace

Given a raw memory area chunk, constructs an object of class type T at that address. The constructor is passed the arguments Args.

T emplace(T, Args...) (
  void[] chunk,
  auto ref Args args
)
if (is(T == class));

If T is an inner class whose outer field can be used to access an instance of the enclosing class, then Args must not be empty, and the first member of it must be a valid initializer for that outer field. Correct initialization of this field is essential to access members of the outer class inside T methods.

Preconditions

chunk must be at least as large as T needs and should have an alignment multiple of T's alignment. (The size of a class instance is obtained by using _traits(classInstanceSize, T)).

Note

This function can be @trusted if the corresponding constructor of T is @safe.

Returns

The newly constructed object.

Example

static class C
{
    int i;
    this(int i){this.i = i;}
}
auto buf = new void[__traits(classInstanceSize, C)];
auto c = emplace!C(buf, 5);
writeln(c.i); // 5

Function emplace

Given a raw memory area chunk, constructs an object of non-class type T at that address. The constructor is passed the arguments args, if any.

T* emplace(T, Args...) (
  void[] chunk,
  auto ref Args args
)
if (!is(T == class));

Preconditions

chunk must be at least as large as T needs and should have an alignment multiple of T's alignment.

Note

This function can be @trusted if the corresponding constructor of T is @safe.

Returns

A pointer to the newly constructed object.

Example

struct S
{
    int a, b;
}
auto buf = new void[S.sizeof];
S s;
s.a = 42;
s.b = 43;
auto s1 = emplace!S(buf, s);
assert(s1.a == 42 && s1.b == 43);

Authors

Walter Bright, Andrei Alexandrescu, Shin Fujishiro, Adam D. Ruppe, Kenji Hara

License

Boost License 1.0.