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属性令人惊讶的在ref和scope间地来回移动.
b,是因为不返回指针,scope不必return.同样泛型有奇怪行为.
因为在@system代码中来回转换指针为ref是合法的,a,c会导致问题.
ref,return和scope可任意但不能多次出现,并与其他如const属性混合.
该提议是,如果return和ref相邻,则结果就是returnRef.同样,return和scope变成returnScope.如果无这两种模式,则与a..e行为相同.
同时拥有returnRef和returnScope仍然非法.
对构成员函数:
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次迭代时后向兼容.
浙公网安备 33010602011771号