繁体   English   中英

const值运行时评估

[英]const values run-time evaluation

以下代码的输出:

const int i= 1;
(int&)i= 2;          // or:  const_cast< int&>(i)= 2;
cout << i << endl;

1 (至少在VS2012下)

我的问题:

  • 是否定义了此行为?
  • 编译器是否总是使用定义的常量值?
  • 是否有可能构建一个编译器将使用最新赋值的示例?

它完全没有定义。 你只是不能改变常量的值。

碰巧的是,编译器会将您的代码转换为类似的代码

cout << 1 << endl;

但程序也可能崩溃,或做其他事情。

如果将警告级别设置得足够高,编译器肯定会告诉您它不起作用。

是否定义了此行为?

此代码的行为未由C ++标准定义,因为它尝试修改const对象。

编译器是否总是使用定义的常量值?

在这种情况下,编译器使用什么值取决于实现。 C ++标准没有强制要求。

是否有可能构建一个编译器将使用最新赋值的示例?

可能存在编译器修改值并使用它的情况,但它们不可靠。

答案是行为未定义。

我设法建立了这个确凿的例子:

#include <iostream>

using namespace std;

int main(){

        const int i = 1;

        int *p=const_cast<int *>(&i);
        *p = 2;
        cout << i << endl;

        cout << *p << endl;

        cout << &i << endl;

        cout << p << endl;

        return 0;
}

其中,在gcc 4.7.2下给出:

1
2
0x7fffa9b7ddf4
0x7fffa9b7ddf4

所以,就像你拥有相同的内存地址,因为它拥有两个不同的值。

最可能的解释是编译器只是用它们的文字值替换常量值。

正如其他人所说,行为是不确定的。

为了完整起见,以下是标准的引用:

(§7.1.6.1/ 4)除了可以修改任何声明为可变的类成员(7.1.1)之外,任何在其生命周期内修改const对象的尝试(3.8)都会导致未定义的行为。 [例如:

[...]

 const int* ciq = new const int (3); // initialized as required int* iq = const_cast<int*>(ciq); // cast required *iq = 4; // undefined: modifies a const object 

]

注意,单词object是这个段落引用的各种对象,包括简单的整数,如示例所示 - 不仅仅是类对象。

尽管该示例引用了指向具有动态存储的对象的指针,但该段落的文本清楚地表明这也适用于对具有自动存储的对象的引用。

您正在使用类似C的const_cast cast operator执行const_cast

使用const_cast不保证任何行为。

如果你这样做,它可能会起作用,也可能不起作用。

(你知道在C ++中使用类似C的运算符是不好的做法)

是的,你可以,但只有当你将const作为只读但不是编译时const时,如下所示:

int y=1;
const int i= y;
(int&)i= 2;
cout << i << endl; // prints 2

C ++ const关键字可以是missleading,它可以是const或只读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM