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
模板.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现