d作者:解析dip1000的歧义

原文地址

解决ref-return-scope参数的歧义

ref return scope声明函数参数时,是return ref还是return scope?
考虑以下类型:

类型意思
P间接
I间接引用
X可能有或可能无间接寻址

当前这样解析:

a,P foo(ref return scope P p)=>ref returnScope
b,I foo(ref return scope P p)=>returnRef scope
c,ref X foo(ref return scope P p)=>returnRef scope
d,X foo(ref return scope I)=>returnRef
e,ref X foo(ref return scope I)=>returnRef

d,e是根据删除scope方式来解释,因为如果I不包含间接引用则无意义.
用T泛型时,麻烦就来了,且return属性令人惊讶的在refscope间地来回移动.
b,是因为不返回指针,scope不必return.同样泛型有奇怪行为.
因为在@system代码中来回转换指针为ref是合法的,a,c会导致问题.
ref,returnscope可任意但不能多次出现,并与其他如const属性混合.
该提议是,如果returnref相邻,则结果就是returnRef.同样,returnscope变成returnScope.如果无这两种模式,则与a..e行为相同.
同时拥有returnRefreturnScope仍然非法.
对构成员函数:

struct S {
     T foo() return scope { ... }
}

第一参是ref S.但可通过允许foo()后接ref来消歧,如下:

T foo() return ref scope { ... } 
// returnRef scope
T foo() ref return scope { ... }
// ref returnScope

Dennis:
我确实喜欢找相邻的"返回域"的想法.
但不喜欢a..e规则背后复杂性,宁愿简化它而非加它,替代提案:有相邻return scope关键字时,结果为ref returnScope.其他一切都为returnRef scope.如何?
可使用scope return来使return Ref为成员函数,不需要新语法.
W.B:
我想仅允许,"return ref"/"return scope",第1次迭代时后向兼容.

posted @ 2021-11-24 14:51  zjh6  阅读(11)  评论(0)    收藏  举报  来源