3

以下代码的输出:

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

1(至少在VS2012下)

我的问题:

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

6 回答 6

7

它是完全未定义的。您只是无法更改常量的值。

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

cout << 1 << endl;

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

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

于 2012-12-26T13:16:46.140 回答
4

Is this behavior defined?

The behavior of this code is not defined by the C++ standard, because it attempts to modify a const object.

Would the compiler always use the defined value for constants?

What value the compiler uses in cases like this depends on the implementation. The C++ standard does not impose a requirement.

Is it possible to construct an example where the compiler would use the value of the latest assignment?

There might be cases where the compiler does modify the value and use it, but they would not be reliable.

于 2012-12-26T13:15:38.330 回答
3

答案是行为未定义。

我设法建立了这个结论性的例子:

#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

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

最可能的解释是编译器只是简单地将常量值替换为其文字值。

于 2012-12-26T13:24:28.623 回答
3

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

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

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

[...]

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

]

请注意,本段中的对象一词是指所有类型的对象,包括简单的整数,如示例中所示——不仅仅是类对象。

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

于 2012-12-26T13:34:04.947 回答
-1

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

使用const_cast并不保证任何行为。

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

(你知道在 C++ 中使用类似 C 的运算符不是一个好习惯)

于 2012-12-26T13:11:05.547 回答
-2

是的,您可以,但前提是您将 const 作为只读而非编译时 const 启动,如下所示:

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

C++ const 关键字可能会产生误导,它要么是 const 要么是只读的。

于 2012-12-26T13:22:14.050 回答