D 如何使用union const成员?

D 如何使用union const成员?,d,D,假设我有一个简化的类: class A { this(const char* result) { this.result = result; } private: union{ const char** results; const char* result; } } 编译因构造函数app.A而失败。常量字段结果缺少此初始值设定项。我知道如果我在联合定义中删除con

假设我有一个简化的类:

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

    private:
        union{
            const char** results;
            const char* result;
        }
}
编译因构造函数app.A而失败。常量字段结果缺少此初始值设定项。我知道如果我在联合定义中删除
const
限定符,我可以使它编译,但我知道成员是const


编辑:

当我将代码更改为:

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

    private:
        union U {
            const char** results;
            const char* result;
        }
}
我遇到另一个错误:
错误:需要“this”来表示“const(char*)”类型的“result”


顺便说一句,我使用dmd v2.068.2,最简单的方法是初始化它:

    this.results = null;
    this.result = result;
确保先设置不使用的,因为您不想用null覆盖union

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

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

    A a;

this(const char* result)
{
    this.a.result = result;
}
然后编译器意识到它们都是一个字段,只要求初始化一次

我认为这可以说是一个错误,你的代码不工作。。。看起来编译器对待匿名联合和结构的方式是一样的,而联合应该是不同的,因为一个变量涵盖了它们


但是简单地将两者都设置的解决方法是可行的,所以我现在就这么做。编辑:事实上,我想我更喜欢命名联合选项。那么,在以后阅读代码时,他们在一起就更明显了。

我认为您的代码没有意义。我猜你使用const是错误的

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

    private:
    union
    {
        const(const(char)*)* results; // maybe const(char)** results
        const(char)* result;
    }
}
或者你可以移除工会:

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

    private:
    const char* result;        
}

因为无论如何都无法更改
const char**result

你认为我应该提交一个bug吗?如果是,反对什么?DMD?你漏了一行:注意我的东西里还有一个
a在联合体下。当使用命名联合(如命名结构)时,还需要声明该类型的变量才能访问它。请注意,我在设置时也使用了小写的
a
。是的,如果您确实提交了一个bug,它将针对DMD。该修补程序写为:。太快了!你确定你的const用法是正确的吗?const到底是什么?外部级别const允许成员在构造函数之外从不更改。
const char*
const(char)*
之间的区别是后者可以重新分配给不同的字符串,而前者根本不能重新分配。是的,我知道,所以如果只有一个构造函数设置了其中一个常量变量,那么将并集与两个常量变量一起使用是没有意义的,因此,你永远无法设置另一种类型。不过,有时将同一种类型作为两种类型来阅读是有意义的。我假设在我们这里没有看到的真实代码中有更多的上下文。