d域外调用函数
struct Foo { /* ... */
hstring[] getHeader(LowerCaseToken name) scope return
{
return _headers[name].values;
}
hstring[] getHeader(hstring name)() scope return
{
enum token = LowerCaseToken.makeConverted(name);
return this.getHeader(token); // line 605
}
}
//两种.
struct Foo { /* ... */
hstring[] getHeader(LowerCaseToken name) scope return
{
return _headers[name].values;
}
hstring[] getHeader(hstring name)() scope return
{
enum token = LowerCaseToken.makeConverted(name);
return _headers[token].values; // line 605
}
}
为什么只编译后一例?
前者使以下警告:
(605,30):弃用:无法取得'this'域变量地址,因为'scope'只适用一级.
为什么弃用消息打印两次?
是否使用-preview=dip1000编译器标志?
我不能重现.完成的最接近等价如下:
enum LowerCaseToken { u, l, c }
struct Foo {
@safe:
int* dummy;
string[int][LowerCaseToken] _headers;
this(return ref int i)
{
dummy = &i;
}
string[] getHeader(LowerCaseToken name) scope return
{
return _headers[name].values;
}
string[] getHeader(string name)() scope return
{
enum token = LowerCaseToken.l;
// 错误. 删除来编译
auto x = &this;
return this.getHeader(token);
}
}
@safe void main()
{
int x;
auto foo = Foo(x);
foo.getHeader!"h1"();
}
用-preview=dip1000,此操作失败,但显示与你的略有不同的消息,“无法在getHeader这个@安全函数中取本(this)域参地址”.失败是正确的,因为不能有域变量的指针(或数组或类).D没有保护挂名指向的int的x存储类,因为域(Foo*)表明保护Foo的地址,而不是挂名和_headers指针(地址).
但是,仅当创建本指针,而不是用本指针,再加上错误有点不同,所以搞不清.
(为什么打印两次弃用消息?)
该函数是模板.可能被实例化了两次.或,在项目中两次实例化了包含该函数的mixin模板.
浙公网安备 33010602011771号