'int' преобразуется в 'const int' с помощью static_cast, но не инициализируется и не имеет поведения const - PullRequest
2 голосов
/ 15 апреля 2019

Я следую учебному пособию, в котором говорится, что я могу сделать переменную неконстантной, чтобы быть константой, используя статическое приведениеЯ попытался сделать это следующим образом, но компилятор выдает мне ошибку каждый раз.

#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;
}

Я много искал решение, но не нашел.

Ответы [ 2 ]

5 голосов
/ 15 апреля 2019

Константа против изменяемой - какая из них переменная?

Переменная - это то, чем она является, когда вы ее определяете.Если вы напишите:

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».Это означает, что вы не можете изменить его значение, потому что оно постоянное.

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 не изменит какую-либо строку.
1 голос
/ 15 апреля 2019

static_cast<const int&>(j) создает постоянную ссылку на j.Это ссылка, которую нельзя использовать для изменения j.Таким образом, static_cast<const int&>(j) = 5 недопустимо, поскольку пытается изменить j с помощью этой константной ссылки.

Создание постоянной ссылки на j не делает j самой константой.Он просто ведет себя как константа в выражении, где используется приведение.Если вы не сохраняете постоянную ссылку на j и не используете ее с этого момента, вы все равно можете изменить значение оригинала j.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...