相关疑难解决方法(0)

在C++中更改const变量的值

我试图更改一个变量的值,该变量定义为int const,如下所示.

const int w = 10;
int* wp = const_cast <int*> (&w);
*wp = 20;
Run Code Online (Sandbox Code Playgroud)

w的值没有改变,即使在赋值之后仍然是10,尽管它表明w和wp都指向同一个内存位置.但是我可以更改w的值,如果在声明时定义如下

int i = 10;
const int w = i;
Run Code Online (Sandbox Code Playgroud)

如果我改变i的声明使其成为常量

const int i = 10;
Run Code Online (Sandbox Code Playgroud)

w的值不会改变.

在第一种情况下,为什么w的值没有改变,即使w和wp指向相同的内存位置[这是我打印地址时的印象]

与编译器有什么不同,它以不同的方式处理这两种情况?

有没有办法确保w不会失去常数,无论它的定义方式如何?

c++ const

16
推荐指数
3
解决办法
2万
查看次数

可以抛弃constness导致未定义的行为?

const int a = 10
int *p = (int*) &a;
*p = 20;
printf("a = %d", a);
Run Code Online (Sandbox Code Playgroud)

是否可以输出10或20,具体取决于编译器?

c casting const

12
推荐指数
4
解决办法
566
查看次数

可变成员是否对非可变成员禁用const优化?

据我所知,在C++中,具有相同访问控制的类/成员以声明顺序存储在内存中.是下一个例子m,c应该一个接一个地存储:

#include <cstdlib>
#include <iostream>

struct X
{
    mutable int m;
    int         c;
};

const X cx = {0, 1};

int main()
{   
    X& x = const_cast<X&>(cx);

    x.m = rand();
    x.c = rand();

    std::cout<<x.m<<" "<<x.c;
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,程序运行并打印2个随机数.如果我删除mutable它崩溃,因为cx存储在只读保护的内存中.

这让我很奇怪 - 一个mutable成员是否禁用const整个优化struct(以某种方式使所有成员mutable)?

是否可以将struct只读存储器和其他部件中的部分存储在非只读存储器中并遵守C++标准存储器布局?

这是在Windows 7上使用Visual Studio 2010和在Ubuntu上使用GCC 4.7.2测试的.

c++ const mutable

5
推荐指数
2
解决办法
490
查看次数

指针铸造没有给出预期的结果

可能重复:
C/C++更改const的值

以下程序:

int main()
{
    const int x = 10;
    int * p = (int *)&x;
    *p = 12;
    cout<<x<<endl;
    cout<<*p<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

给出一个输出:

10
12
Run Code Online (Sandbox Code Playgroud)

cast&x对(int*)有什么影响?为什么x的值仍为10?我预计它会是12.

另一个疑问

为什么我们不能把int**说成int const**?相反,此操作有效

void f(int const ** p);
void g(int const * const * p);

int main()
{
    int ** p = /*....*/
    f(p);   //Error
    g(p);   //OK
}
Run Code Online (Sandbox Code Playgroud)

请通过合适的示例帮助我理解这一点谢谢!

c++ pointers

3
推荐指数
1
解决办法
126
查看次数

const&指的是非易失性变量.变量发生了变化.更改是否使const&?无效?

在C++中,可以const &改变的价值吗?

好吧,当然不能改变,可以吗?这const意味着什么.而且,听听Stroustrup:

const左值参考指的是恒定的,这是从视角的参照的用户的点不可变的.

但是这个怎么样?

#include <iostream>

int main() {
    int           a = 0;
    const int&    r = a;
    const int old_r = r;
    ++a;
    const int new_r = r;
    std::cout
      <<      "old_r == " << old_r
      << " but new_r == " << new_r << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这输出,old_r == 0 but new_r == 1.

这是我真正的问题.在上面的代码中,查看该行

    const int new_r = r;
Run Code Online (Sandbox Code Playgroud)

只要

  • 地址&new_r既不在此行也不在代码的其他地方提取
  • 代码什么都没有volatile,

没有任何东西阻止优化编译器从合并old_r …

c++ const reference undefined-behavior const-reference

1
推荐指数
1
解决办法
120
查看次数