const struct {x} vs struct {const x}

时间:2013-12-20 12:57:16

标签: c++ struct const constants

这是一个相当简单的问题,但不知何故很难找到一个简单的答案。

在C ++中,(编辑)const修改的struct变量和(edit :)非const struct变量之间的区别是什么,但是struct具有all-const成员? :

typedef struct mystruct {
    const int x;
} t1;
const t1 s1;

VS

typedef struct {
    int x;
} t2;
const t2 s2;

? (如果答案是“与课程相同”,那么请为课程解释或链接到解释。)

3 个答案:

答案 0 :(得分:6)

没有const struct这样的东西。您可能已经看到过类似的内容:

const struct {
    int x;
} y;

这是一个带结构类型的变量y的声明。变量yconst,而不是结构。你可以认为它类似于:

struct mystruct {
    int x;
};

const mystruct y;

不给结构类型命名。

答案 1 :(得分:4)

假设

const struct mystruct1 {
    int x1;
    int x2;
} s1;

struct mystruct2  {
    const int x1;
    int x2;
} s2;

对于s1,您不应为任何成员分配值。

对于s2,不应仅为成员x1分配值。一个人可以免费为x2这样做。


为了更接近你的例子,可以做:

typedef const struct mystruct1 {
    int x1;
    int x2;
} S1;

typedef struct mystruct2 {
    const int x1;
    int x2;
} S2;

S1 s1;
S2 s2;

对于s1s2,此处适用与上述相同的规则。


<强> Upate

从字面上引用你的问题(暗示我的例子中的修正),两个结构之间在它们携带的值的恒定性方面没有实际差异。

答案 2 :(得分:3)

下面的两个对象ab之间的 有效差别很小:

struct A
{
   int x, y;
};

struct B
{
   const int x, y;
};

const A a;   // (plus initialiser)
B b;         // (plus initialiser)

(当然,您知道 A的其他实例可能不是const - 合格,然后您就会有明显的区别。)

在一种情况下,您无法以不同的方式访问成员。但是:

  1. const - 确定类型(而不是成员)会影响引用绑定:

    void foo(A& a);
    void foo(B& b);
    
    int main()
    {
       const A a;
       B b;
    
       foo(a);  // Error!
       foo(b);  // OK
    }
    

    当然,如果您使用指针而不是引用,情况也是如此。 const上下文仅在应用于类型时传播到调用代码,而不是封装在成员中。