d的右值引用
右值属性
开关:-preview=rvalueattribute
,
代码:
struct S {}
void func(@rvalue ref S p);
@rvalue ref S func();
S a;
auto b = cast(@rvalue ref)a;
void gun(@rvalue ref S p)
{
enum r = __traits(isRvalueRef, p);
}
void func()(auto @rvalue ref S p);
auto @rvalue ref S func();
右值引用仅用于函数参数/函数返回
,
右值引用仅接收右值或右值引用
.
这里的右值引用
为:
1,转换(@右值引用)
表达式
2,返回右值引用
的函数.
右值引用
函数仅返回右值引用
右值引用,可用引用
重载,但不能用值参数
重载.
仅左值可以转换(@右值引用)
__特征(是右值引用)
对@右值引用
,返回真
用__特征(取属性)
调用带@右值引用
的函数参数时,包含这个属性
,
当函数返回带@右值引用
的函数时,__特征(取函数属性)
也有这个属性
.
动 引用
参数保留他们语义,如果是动 @右值引用
,则扩展为:
1,如果接收的参数是左值
,则为引用
.
2,如为右值
,则为右值引用
.
动 引用
在函数返回时,如返回是引用
,则引用
,如返回表达式
是右值引用
,则为@右值引用
,右值
,则为值
,这里不知道,是不是有问题?
动 引用
与动 @右值引用
是同义的,因为它们不像参数
冲突,他们并不冲突.
右值类型构造器
编译器开关-preview=rvaluetype
.
struct S {}
void func(@rvalue ref S p);
ref @rvalue(S) func();
S a;
auto b = cast(@rvalue)a;
void gun(ref @rvalue(S) p)
{
enum r = is(typeof(p) == @rvalue);
}
const(@rvalue(S))* var;
void func()(auto ref @rvalue(S) p);
auto ref @rvalue(S) func();
assert(typeid(@rvalue(int)).toString() == "@rvalue(int)");
static assert(is(@rvalue(S) : S));
static assert(!is(@rvalue(S)* : S*));
语义总结:
@右值
类型构造器:
-提供两种语法,即@右值
和__右值
,TBR保留一种.
-,除了用作函数参数,不能用@右值
声明变量
.但可声明指向@右值
型的指针(如:@右值(T)*
).
-数组和关联数组
元素类型不能为@右值
.
-@右值引用
参数地址是右值指针(@右值(T)*)
.
-对@右值
类型is(T==@右值)
为真
.
-转换(@右值)
会加入@右值
.
-具型()
能识别@右值
.
-右值
隐式转换,只能转换至没有右值
其余见上面.都不变
完美转发
要求的右值引用
不用在每一级复制/移动
.动 @右值引用
可完美转发.
绑定右值到引用
是个单独问题.即使在C++中,也存在右值引用和常 引用
.
已实现移动语义和完美转发的核心
.任何语法只是解析下.例如,用@移动
属性(可替代右值引用
).
d的示例
import std;
void main(){
string text = "Helo World!";
auto e=Base64.encode(text.representation);
//base64,ubyte[],string->char[]
auto d=Base64URL.decode("TWFyY29uZQ==");
writeln(e); // prints: "TWFyY29uZQ=="
writeln(to!string(d)); // prints: [77, 97, 114, 99, 111, 110, 101] but I want to print: "Helo World!"
writeln(cast(string)d);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现