DMD用复制构造函数移动结构
struct std_string
{
std_string* ptr;
ulong[3] data;
this (ulong data)
{
this.data[] = data;
this.ptr = &this;//这里
}//生命期不一致.
this(const scope ref std_string from)
{
assert(&from is from.ptr);
assert(this.ptr is null);
this.ptr = &this;//这里
this.data = from.data;
}
~this ()
{
assert(this.ptr is &this);
}
alias opAssign = assign;
ref std_string assign () (const auto ref std_string rhs)
{//auto ref很可疑,按引用,按值?
return this.assign2(rhs);
}
ref std_string assign2 (const ref std_string rhs) return
{
assert(rhs.ptr is &rhs);
assert(this.ptr is null || this.ptr is &this);
this.data = rhs.data;
return this;
}
}
void main ()
{
std_string tmp = 42;
assert(tmp.ptr is &tmp);
tmp = std_string(42);
assert(tmp.ptr is &tmp);
}
最初测试是查看DMD
是否会使用复制构造器
移动结构.上面的代码在LDC
和GDC
下编译和运行良好,但在DMD
下断定.
记住,D
禁止成员内部指针
.
如果添加@safe
并用-preview=dip1000
编译,会得到:
第15
行是:在构造器中this.ptr=&this;
第22
行是:在复制构造器中this.ptr=&this;
它不能仅用ref
编译,所以简单删除auto ref
会产生相同的结果(析构器中无限循环
断定)
但是,按值传递
表明另一个
构造器和析构器调用,我怀疑问题出在"自动引用
"上,复制
构造器应该通过引用
传递右值,对不?
不支持内部指针
表明用户
无法对接std::string
,这对C++
互操作是个巨大
的打击.内部指针
也是有复制构造器
原因之一,不是吗?
对调用者
中构造的值
,我希望单个
构造器调用.即,我期望:
tmp = std_string(42);
//和
auto someLValue = std_string(42);
tmp = someLValue;
只调用一次std_string
构造器.
如果不使用autoref
(按值传递),代码
编译为上面两个片段,但在左值
时就,会再调用一次
构造器.
如果我使用普通的引用
,不会编译
第一个代码片(按右值传递).
注意,原始
测试用例使用的是它只是接受右值的ref
的in
,所以我怀疑auto ref
在此有问题(特别是考虑到LDC
和GDC
正确,只有DMD
有).
解释GDC
行为.*因为*
有个析构器(或postblit
,复制构造器
或其他使构不可复制
的东西),则该类型是总是
通过不可见引用隐式
传递和返回的.
正确化简如下:
struct std_string
{
std_string* ptr;
ulong[3] data;
this (ulong data)
{
this.data[] = data;
this.ptr = &this;
}
~this ()
{
}
//即使前端决定从签名中删除`'ref'`,`GDC`和`LDC`强制转换`'autoref'`为`'ref'
ref std_string opAssign()(const auto ref std_string rhs)
{
assert(rhs.ptr is &rhs);
return this;
}
}
void main ()
{
std_string tmp;
tmp = std_string(42);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现