out 参数是一个 ref,其值被隐式重新初始化了吗?

Is an out parameter a ref whose value is implicitly reinitialized?

Dlang 将输出参数描述为:

A parameter initialized upon function entry with the default value for its type.

函数入口参数初始化为默认值后,本质上不就是一个ref吗?

import std.stdio;

void foo(out int x)
{
    writeln(x); //prints 0
    x = 2;
}

void main()
{
    int x = 1;
    writeln(x); //prints 1
    foo(x);
    writeln(x); //prints 2
} 

我没有看到任何比较 outref 的文档。
out 参数概念化为写作的快捷方式是否准确:

import std.stdio;

void foo(ref int x)
{
    x = x.init; //happens implicitly
    writeln(x); //prints 0
    x = 2;
}

void main()
{
    int x = 1;
    writeln(x); //prints 1
    foo(x);
    writeln(x); //prints 2
}

我不知道语言的复杂性,所以我担心有这种印象会导致我将来在不可预见的情况下感到悲伤。

这些 parameter storage classes 之间是否可以做出更强的区分,或者它真的是一个自动重新初始化的 ref 参数?

Is an out parameter a ref whose value is implicitly reinitialized?

是的。

After the parameter is initialized with a default value on function entry, isn't it essentially just a ref?

是的。

Can a stronger distinction be made between these parameter storage classes, or is it truly a ref param that's automatically re-initialized?

后者。至少,我是这么想的。我希望我没有遗漏任何东西。

是的,这就是今天实施的全部内容,但这并不是语义上的确切含义。

out 参数视为额外的 return 值,而不是传统意义上的参数,您应该没问题。函数不能获取其 return 值的地址,也不能通过它接收数据。 out 参数也不应该以这些方式使用。


D 以前没有 ref。它改为使用 inoutinout 作为参数存储 类.

in 意味着(并且意味着,它仍然存在)您将要查看,但不会修改或存储对它的引用(后者使它不同于 const - 您可以存储 const,但不能存储 inscope 参数,这在理论上允许编译器优化它们的内存分配)。仅供流量使用。

out 表示该函数将在该变量中存储数据,但不会查看或存储它。当函数将其结果写入其中时,预先已经存在的值将丢失。编译器在函数入口时重置它以保证程序不依赖于通过它传递的某些值。

最后,旧的 inout 是它会接收数据,然后存储一个值。今天(好吧,从五年前开始),这种用法早已不复存在, inout 意味着完全不同的东西(const 但 returning constness 取决于输入; const/immutable/mutable限定词out和in是一样的),旧的用法被替换为ref,这也扩展了意义:不再是数据进出,而是对另一个变量的完整引用,这意味着您可以执行诸如获取地址之类的操作。

虽然out实现为ref加上自动重新初始化,你应该记住它的原意:你向它写入数据但不做任何其他事情。不要使用它的地址 - 这在 ref 中是合法的(除非它是 scope refin ref...)但在 out 中是不正确的。你应该给它写信,仅此而已。