我正在跟踪一个教程,它说我可以使用静态强制转换将非const变量设为const。我尝试这样做,但编译器每次都会给我一个错误。
#include <iostream>
using namespace std;
int main()
{
int j = 0;
static_cast<const int&>(j) = 5 ;
cout << j;
return 0;
}
编译器给我以下错误消息。
hello.cpp: In function 'int main()':
hello.cpp:11:28: error: assignment of read-only location 'j'
static_cast<const int&>(j) = 5 ;
然后,我尝试查看'j'是否变为常数。但是我可以为此赋值,编译器在那里没有显示任何问题。由于前一行中的问题,可能是编译器未编译该行。
#include <iostream>
using namespace std;
int main()
{
int j = 0;
static_cast<const int&>(j) = 5 ;
j = 8;
cout << j;
return 0;
}
我已经搜索了很多解决方案,但没有找到任何解决方案。
答案 0 :(得分:5)
变量就是定义变量时的含义。如果您写:
int j = 0; // j is a mutable int
然后j
是可变的int
。这不会改变。如果您写
const int j = 0; // j is a constant int
然后j
是const int
。写作
static_cast<const int&>(j)
表示“在此表达式的上下文中,将j
视为const
”。这意味着您无法更改它的值,因为它是const。
static_cast<const int&>(j) = 10; //Error: can't change the value of a const int
const
在哪里有用? const
很有用,因为它可以防止意外更改某些内容而导致的错误。例如,我可以编写一个计算字符串中空格的函数:
int countSpaces(const std::string& s) {
int count = 0;
for(char c : s) {
if(c == ' ') count += 1;
}
return count;
}.
在这里,我将参数设为const string&
。这能实现什么?
const std::string&
是一个引用,所以我不必复制字符串(这会很昂贵)const std::string&
是常量,所以写countSpaces
的人承诺countSpaces
不会更改任何字符串。 答案 1 :(得分:1)
static_cast<const int&>(j)
创建对j
的常量引用。该参考不能用于修改j
。因此,static_cast<const int&>(j) = 5
无效,因为它试图通过该常量引用来修改j
。
创建对j
的常量引用并不会使j
本身成为常量。在使用强制转换的表达式中,它的行为就像一个常量。除非您始终保持对j
的引用并从现在开始使用它,否则仍然可以更改原始j
的值。