d - 如何使用联合常量成员?

标签 d

假设我有这个简化的类:

class A {
    this(const char* result)
    {
        this.result = result;
    }

    private:
        union{
            const char** results;
            const char* result;
        }
}

编译失败,构造函数 app.A.this 缺少 const 字段结果的初始值设定项。我知道如果删除联合定义中的 const 限定符就可以编译它,但我知道成员是 const。


编辑:

当我将代码更改为:

class A {
    this(const char* result)
    {
        this.U.result = result;
    }

    private:
        union U {
            const char** results;
            const char* result;
        }
}

我收到另一个错误:错误:需要“this”作为“const(char*)”类型的“结果”

顺便说一句,我使用 dmd v2.068.2

最佳答案

最简单的方法就是初始化它:

    this.results = null;
    this.result = result;

确保首先设置您不使用的那些,因为您不想用 null 覆盖联合!

您还可以将其设为命名联合:

    union A{
        const char** results;
        const char* result;
    }

    A a;

this(const char* result)
{
    this.a.result = result;
}

然后编译器意识到它们都是一个字段,并且只要求初始化一次。

我认为您的代码无法工作可以说是一个错误...看起来编译器以相同的方式对待匿名联合和结构,而联合应该不同,因为一个变量涵盖了所有这些。

但是简单地设置这两个方法就可以了,所以我现在就是这样做的。编辑:实际上,我想我更喜欢命名联合选项。那么后面看代码的时候就更明显一点了,他们是在一起的。

关于d - 如何使用联合常量成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33415489/

相关文章:

compilation - rdmd 命令无法识别

types - to!string() 和 cast(string) 有什么区别

windows - D: Windows 上的 executeShell 运行另一个不立即返回的程序

d - 从数组中定义的文件名导入内容

d - 关于 'align' 属性的混淆

exception-handling - 有标准异常(exception)吗?

struct - 使用 CTFE 生成结构体别名集

http - 使用 D,我将如何监听传入的 HTTP 请求并响应它们?

types - 为什么编译器不警告强制转换为枚举?

d - 配置 DUB 以使用 64 位编译器