【问题标题】:D disabling struct from being lvalueD 禁止 struct 成为左值
【发布时间】:2013-08-03 14:03:32
【问题描述】:

有什么方法可以禁止结构体被用作左值(不能用作变量)?

我已经尝试禁用构造函数和 opAssign,但最后,您仍然可以从函数中分配它。

unittest
{
    //mystruct doesntCompile;
    mystruct shouldntCompile = makeMyStruct();
}


struct mystruct
{
    @disable this();
    @disable this(this);
    @disable void opAssign(ref mystruct);
    @disable void opAssign(mystruct);
    this(int dummyArgument){}
}

mystruct makeMyStruct()
{
    return mystruct(0);
}

【问题讨论】:

  • 您在寻找const 关键字吗?

标签: variables struct d lvalue


【解决方案1】:

有什么方法可以禁止结构体被用作左值(不能用作变量)?

不,这是不可能的。每种类型都可以有左值实例。

如果您let us know what you are trying to achieve,您可能会得到更好的答案。 为什么你想阻止你的结构被用作左值?

【讨论】:

  • 问题主要是病态的好奇心。
  • 最初的问题是实现一个带有 swizzles 的向量结构,您可以在其上使用所有运算符(包括 opOpAssign)。我们现在已经使用代理结构实现了这一点。代理结构本身不应用作变量,而应仅临时存在于表达式中。您不应该这样做:auto proxy = vec.xyz; proxy.x = 5; //Changes vec.x 因为这会使值类型期望无效。当前实现在代理内部使用联合。
  • 好的,问题是你能通过代理写吗?我可以阅读吗?如果您分享代理的实现并准确说明它的使用方式,我很确定我可以提供帮助。你的问题问的似乎不是你需要做的。
  • 是的,完全正确。用户应该能够读取原始向量的值,但只能使用单个表达式分配给它们。预期用法示例:vec1.zw += vec2.zw + vec3.yz;//All swizzles are proxies 我的简单希望是,通过拒绝使用左值,我们可以将auto proxy = vec.xyz; 之类的赋值默认为alias makeVector this。感谢您提供帮助,但代码尚不适合公众检查。此外,我或多或少相信我有能力看透这一点。 :)
猜你喜欢
  • 1970-01-01
  • 2014-10-09
  • 2017-04-07
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2020-07-09
相关资源
最近更新 更多