感叹号运营商?

thw*_*hwd 25 d operators

我正在学习D并且已经看到了很多像这样的代码:

ushort x = to!ushort(args[1]);
Run Code Online (Sandbox Code Playgroud)

我认为这蒙上args[1]ushort,但是这是什么之间的区别cast(ushort)

编辑:感叹号运算符还有其他用途吗?

Meh*_*dad 34

在D中,

to!ushort(args[1])
Run Code Online (Sandbox Code Playgroud)

模板实例化的简写

to!(ushort)(args[1])
Run Code Online (Sandbox Code Playgroud)

和类似的

to<ushort>(args[1])
Run Code Online (Sandbox Code Playgroud)

在C++/Java/C#等语言中.

感叹号是要指出它不是常规参数,而是模板参数.

记法也不能使用角括号,因为这些都是可笑很难正确地分析了编译器(他们所做的语法很上下文敏感的),这使得它更加困难,以实现正确的编译器.有关详细信息,请参见此处

我所知道的唯一其他用途就是一元'不'操作(例如false == !true)......我现在想不出任何其他用途.


关于演员:

cast(ushort)是一个未经检查的强制转换,因此如果该值超出范围,它将不会抛出异常.

to!ushort()是一个经过检查的强制转换,因此如果该值超出范围,则会抛出异常.

  • 我会指出,从技术上来说,`to!ushort(val)`实际上并不是演员.它是使用函数`std.conv.to`的转换.它被_is_检查过,但如果你开始称它为演员,你可能会造成混乱.仅使用强制转换操作符进行强制转换. (5认同)
  • 它似乎也是!更多的是词法演员,例如to!string(f)对浮点f和cast(字符串)f有效 - 不是. (3认同)