'int' 使用 static_cast 转换为 'const int',但既没有初始化也没有 const 行为
'int' convert to 'const int' with static_cast, but neither initialize nor have const behavior
我正在学习一个教程,它说我可以使用静态转换将非 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;
}
我搜索了很多解决方案,但没有找到任何解决方案。
static_cast<const int&>(j)
创建对 j
的常量引用。那是一个引用,不能用来修改 j
。因此,static_cast<const int&>(j) = 5
无效,因为它试图通过该常量引用修改 j
。
创建对 j
的常量引用不会使 j
本身成为常量。它只是在使用强制转换的表达式中表现得像一个常量。除非您保留对 j
的常量引用并从现在开始使用它,否则您仍然可以更改原始 j
.
的值
常量与可变 - 哪个是变量?
变量就是你定义它时的样子。如果你写:
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)
表示"In the context of this expression, treat j
as though it were 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&
是const,写countSpaces
的人承诺countSpaces
不会改变任何字符串。
我正在学习一个教程,它说我可以使用静态转换将非 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;
}
我搜索了很多解决方案,但没有找到任何解决方案。
static_cast<const int&>(j)
创建对 j
的常量引用。那是一个引用,不能用来修改 j
。因此,static_cast<const int&>(j) = 5
无效,因为它试图通过该常量引用修改 j
。
创建对 j
的常量引用不会使 j
本身成为常量。它只是在使用强制转换的表达式中表现得像一个常量。除非您保留对 j
的常量引用并从现在开始使用它,否则您仍然可以更改原始 j
.
常量与可变 - 哪个是变量?
变量就是你定义它时的样子。如果你写:
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)
表示"In the context of this expression, treat j
as though it were 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&
是const,写countSpaces
的人承诺countSpaces
不会改变任何字符串。