Кастинг. Какая разница между временной переменной и константой в C ++?

Позвольте мне сначала опубликовать мой код:

void Fun(short &s){}
void FunCon(const short &s){}

int main()
{
int iTest = 20;//note: iTest is int but parameter of Fun is "short &"Fun(iTest);//error, I know there is a temp variable(typecast)
FunCon(iTest);//ok
return 0;
}

я знаю Fun(iTest);будет генерировать новый временная переменная(typecast), но мне интересно, является ли временная переменная постоянная?

Если нет: Почему я не могу передать переменную temp short &

Если даУ меня есть другой код, подобный этому:

class MyObject{
public :
void F(){}
};

MyObject MOCreator(){
return MyObject();
}

int main()
{
MOCreator().F();//OK
return 0;
}

Если временная переменная, которая возвращается MOCreator() постоянно, Почему временная переменная может позвонить неконстантная функция-член?

Мои вопросы :

1) В чем разница между временная переменная а также постоянная в С ++?

2) Есть предложение в Мышление в C ++(стр. 507). Правильно ли предложение? и почему?:

Временные объекты автоматически Const

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

Заранее спасибо.

3

Решение

Интересно, является ли временная переменная постоянной?

Нет, это просто временная переменная, которая будет уничтожена в конце полного выражения, в котором она была создана.

Почему я не могу передать переменную temp в short &

Временное не может быть связано с неконстантной ссылкой. Но это может быть связано для константной ссылки, и время жизни временного будет увеличено, чтобы соответствовать времени жизни ссылки. Вот почему FunCon(iTest); Это хорошо.

почему временная переменная может вызывать неконстантную функцию-член?

Все в порядке. Единственная особенность — временная переменная будет уничтожена в конце полного выражения.

Правильно ли предложение? и почему?
Временные объекты автоматически константны

Нет. Если вы явно не объявите, что это const.

2

Другие решения

Анонимные временные значения — это rvalue, которые могут быть связаны только со ссылкой на rvalue или const lvalue ссылка. Так что ваш временный short может быть привязан к short&& или const short&,

Они не const; главная цель ссылок на rvalue состоит в том, чтобы изменить их, перемещая дорогостоящие для копирования ресурсы из них в новый объект.

1

Учитывая следующее:

void f(short& s) {
s = 42;
}

Теперь рассмотрим этот простой вариант использования:

short s = 0;
f(s);
std::cout << s << "\n";

Это напечатает 42 звонка f имел побочный эффект модификации s,

Но теперь рассмотрим следующее, если это было законно:

int i = 0;
f(i);
std::cout << i << "\n";

Это напечатало бы 0, потому что то, что вы изменили бы в f, является временным, с оригинальным i нетронутым.

Чтобы предотвратить такое поведение, вы можете только передать временную ссылку на константную или ссылку на значение.

1
По вопросам рекламы [email protected]