3

Позвольте мне опубликовать мой код первой:В чем разница между временной переменной и константой в 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); будет генерировать новую временную переменную (приведение типа), но мне интересно, если переменная температура является постоянной ?

Если Нет: Почему я не могу передать переменную Temp Чтобы short &

Если Да: У меня есть еще один такой код:

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

MyObject MOCreator(){ 
    return MyObject(); 
} 

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

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

Мои вопросы:

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

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

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

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

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

ответ

2

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

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

Почему я не могу передать переменный временную к коротким &

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

Почему переменная temp может вызывать функцию non-const member?

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

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

No. Если вы явно не возвестит быть константной.

+0

«Временные объекты автоматически const» Является ли предложение правильным? – Joe

+0

@Joe Я не знаю контекста этого, я скажу, что это неправильно только для этого единственного предложения. – songyuanyao

+0

@Joe See [Являются временными объектами в C++ const?] (Http://stackoverflow.com/q/4701558/3309790). – songyuanyao

1

Анонимные временные значения - это значения rvalues, которые могут быть привязаны только к ссылке 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, потому что вы могли бы быть изменений в й является временным, с оригинальным i нетронутым.

Во избежание такого поведения вы можете передать временную ссылку на константу или ссылку на rvalue.