February 07, 2023

Hi All...

Is it a feature or a bug that the code below can be compiled without arguments?

import std.stdio, std.conv : to;
void main()
{
    auto noArgument = Sarr!char(); // it works no argument...
    assert(noArgument.length == 8);

    string dlang = "D-lang";
    const len = dlang.length;

    auto withArgument = Sarr!char(dlang.dup); // complied
    assert(withArgument.arr[0..len].to!string == dlang);
}

template Sarr(alias T = char)
{
    enum s = size_t.sizeof / T.sizeof;
    struct Sarr
    {
        T[s] arr = T(0);
        auto length = s;

        this(A)(A[] arr) in(s >= arr.length)
        {
            foreach(i, e; arr)
            {
                this.arr[i] = cast(T)e;
            }
        }
    }
}

I want to learn one more thing. Why can't the default argument be used in alias of structs? Voldemort types work just fine for example:

template Farr(alias T = char)
{
    enum s = size_t.sizeof / T.sizeof;
    struct Result
    {
        T[s] arr = T(0);
        auto length = s;
    }
    Result Farr(A)(A[] arr) in(s >= arr.length)
    {
        Result result;
        foreach(i, e; arr)
        {
            result.arr[i] = cast(T)e;
        }
        return result;
    }
}

import std.stdio;
void main()
{
    auto arr = [ 'd', 'e' ];
    auto foo = Farr(arr);
    foo.writeln; // Result("de\0\0\0\0\0\0", 8)

    // auto bar = Sarr(arr); // no complied
}

unittest
{
  auto arr = [ 'd', 'e' ];
  ref auto addAndReturn(T)(ref T[] arr) {
    auto a = arr[$-1];
    return arr ~= ++a;
  }

  auto len2 = Sarr!int(arr);
  assert(len2.length == 2);

  auto len4 = Sarr!short(addAndReturn(arr)); // add 'f'
  assert(len4.length == 4);

  auto len8 = Sarr!byte(addAndReturn(arr));  // add'g'
  assert(len8.length == 8);
}

SDB@79

February 07, 2023

On Tuesday, 7 February 2023 at 09:49:46 UTC, Salih Dincer wrote:

>

Is it a feature or a bug that the code below can be compiled without arguments?

You should use @disable this() recommended in the relevant article: https://dlang.org/spec/struct.html#disable_default_construction

void main()
{
    auto noArgument = Sarr!char(); // no compile
}

On Tuesday, 7 February 2023 at 09:49:46 UTC, Salih Dincer wrote:

>

I want to learn one more thing. Why can't the default argument be used in alias of structs?

void main()
{
    auto bar = Sarr!()(dlang.dup); // complied
    assert(is(typeof(bar.arr[0]) == char));
}

😀

SDB@79