Позвольте мне сначала опубликовать мой код:
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
Кто-то спросил меня о простом вопросе, и я столкнулся с большим количеством вопросов на пути к решению вопроса. Я знаю, что они могут быть очень распространенными вопросами, и я долго ищу в сети. Я также получил много разных ответов. Но сейчас я в замешательстве.
Заранее спасибо.
Интересно, является ли временная переменная постоянной?
Нет, это просто временная переменная, которая будет уничтожена в конце полного выражения, в котором она была создана.
Почему я не могу передать переменную temp в short &
Временное не может быть связано с неконстантной ссылкой. Но это может быть связано для константной ссылки, и время жизни временного будет увеличено, чтобы соответствовать времени жизни ссылки. Вот почему FunCon(iTest);
Это хорошо.
почему временная переменная может вызывать неконстантную функцию-член?
Все в порядке. Единственная особенность — временная переменная будет уничтожена в конце полного выражения.
Правильно ли предложение? и почему?
Временные объекты автоматически константны
Нет. Если вы явно не объявите, что это const.
Анонимные временные значения — это rvalue, которые могут быть связаны только со ссылкой на rvalue или const
lvalue ссылка. Так что ваш временный short
может быть привязан к short&&
или const short&
,
Они не const
; главная цель ссылок на rvalue состоит в том, чтобы изменить их, перемещая дорогостоящие для копирования ресурсы из них в новый объект.
Учитывая следующее:
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
нетронутым.
Чтобы предотвратить такое поведение, вы можете только передать временную ссылку на константную или ссылку на значение.