Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/222: Рейтинг темы: голосов - 222, средняя оценка - 4.60
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242

Начальное значение ссылки на неконстантный пар-р должно быть левосторонним значением

06.08.2019, 14:29. Показов 45723. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему он требует этого? Сижу и не до конца понимаю... Т.к. f1() возвращает копию своего же объекта, то есть, на сколько я понимаю, эта копия нигде в памяти долго не лежит, её можно только где-то использовать и она "пропадет". Но как тогда можно ссылаться на что-то временное???
Заранее, спасибо за ваше время
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class a
{
public:
    int aa;
    a() :aa(10){ }
    a f1(){
        cout << "this  f1 -------> " << this << endl;
        return *this;
    }
    a& f2(){
        cout << "this f2 --> " << this << endl;
        return *this;
    }
};
 
 
void main(){
    a d;
    a &k = d.f1();
}
Добавлено через 4 минуты
PS: я знаю, что нужно поставить const в 19 строке, чтобы работало. Но зачем, почему?..
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.08.2019, 14:29
Ответы с готовыми решениями:

Выражение должно быть допустимым для изменения левосторонним значением
День добрый просветите пожалуйста что ему не нравится ? #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using...

Выражение должно быть допустимым для изменения левосторонним значением
Выдает ошибку на P = s; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;string&gt; using namespace std; void main() { ...

Выражение должно быть допустимым для изменения левосторонним значением
//Структура пользователя программой struct User { char Login; char Password; }; User Array; //Функция входа в программу...

16
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.08.2019, 14:31
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
Почему он требует этого? Сижу и не до конца понимаю... Т.к. f1() возвращает копию своего же объекта, то есть, на сколько я понимаю, эта копия нигде в памяти долго не лежит, её можно только где-то использовать и она "пропадет". Но как тогда можно ссылаться на что-то временное???
ССылку потерял a &f1(){

Добавлено через 1 минуту
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
PS: я знаю, что нужно поставить const в 19 строке, чтобы работало. Но зачем, почему?..
Требует const потому что ты возвращаешь по-значению, т.е. временную переменную, на них обычные ссылки делать нельзя, только константные.
1
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
06.08.2019, 14:32
Это происходит потому, что, используя функцию f1(), вы создаете временный объект, т.е. объект, который будет уничтожен сразу после возвращения контроля функции, из которой была вызвана f1(). На такие объекты нельзя ссылаться.
1
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,238
06.08.2019, 14:36
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
a &k = d.f1();
f1- возвращает значение, а не ссылку. Поэтому и требуется
C++
1
a k1 = d.f1();
А для f2 это нормально:
C++
1
a &k2 = d.f2();
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
06.08.2019, 14:39
oleg-m1973,
Не только константные. Ещё на временный объект можно ссылаться используя rvalue ссылку.
MJ_PRUTYG,
const в данном случае нужен для того что бы продлить "время жизни" временного обьекта.
Таким образом "время жизни" обьекта продлевается до тех пор пока "жива" ссылка
1
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
06.08.2019, 15:03  [ТС]
oleg-m1973, вот в книге тоже самое написано,но зачем она там? +Всё равно таже ошибка
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.08.2019, 15:11
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
oleg-m1973, вот в книге тоже самое написано,но зачем она там? +Всё равно таже ошибка
В смысле - зачем ссылка в f1()? Не знаю - тебе там нужно создавать копию самого себя? Подозреваю - нет.
0
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
06.08.2019, 15:14  [ТС]
oleg-m1973, вы написали «потерял ссылку» - так вот и вопрос: зачем она там? Для чего?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.08.2019, 15:22
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
oleg-m1973, вы написали «потерял ссылку» - так вот и вопрос: зачем она там? Для чего?
Чтоб не создавалась копия объекта класса a. Там именно копия должна возвращаться? Обычно так не делают, потому что нет смысла.
1
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
06.08.2019, 15:26  [ТС]
oleg-m1973, аа точно, спасибо, не подумал! так погодите.. А как же тогда оно заработало(я дальше вызывал методы через эту ссылку)? О_о
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.08.2019, 15:33
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
oleg-m1973, аа точно, спасибо, не подумал! так погодите.. А как же тогда оно заработало(я дальше вызывал методы через эту ссылку)? О_о
Там this должен был другой напечатан
1
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
06.08.2019, 15:43  [ТС]
oleg-m1973, почему другой? Мы же возвращаем этот объект, а не его адресс(если не разименовать) . Но принимаем в 19строке адресс, по идее, но возвращает функция объект. Вот тут я и запутался.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.08.2019, 15:47
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
oleg-m1973, почему другой? Мы же возвращаем этот объект, а не его адресс(если не разименовать) . Но принимаем в 19строке адресс, по идее, но возвращает функция объект. Вот тут я и запутался.
Если в 19-й строке оставить обычну ссылку - a &k = d.f1();, то не скомпилируется.
Если сделать const a &k = d.f1(); а затем k.f2(), то выведет другой this.
1
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
06.08.2019, 21:15  [ТС]
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Если в 19-й строке оставить обычну ссылку - a &k = d.f1();, то не скомпилируется.
так вот в этом и дело - компилируется! Я сам понял ошибку, но..но оно компилируется и нормально работает. Это вообще как???
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.08.2019, 21:23
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
так вот в этом и дело - компилируется! Я сам понял ошибку, но..но оно компилируется и нормально работает. Это вообще как???
Это у майкрософта косяк, причём, по-моему, довольно старый. В gcc всё правильно - cannot bind non-const lvalue reference of type 'a&' to an rvalue of type 'a'
Нет смысла изменять временную переменную, поэтому если ты делаешь на неё обычную ссылку, то скорее всего это ошибка.
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
06.08.2019, 21:50
Цитата Сообщение от http://eel.is/c++draft/
⁴ [...] Temporary objects are destroyed as the last step in evaluating the full-expression that (lexically) contains the point where they were created. [...]

⁵ There are three contexts in which temporaries are destroyed at a different point than the end of the full-expression. [...]

⁶ The third context is when a reference is bound to a temporary object. The temporary object to which the reference is bound or the temporary object that is the complete object of a subobject to which the reference is bound persists for the lifetime of the reference [...] The exceptions to this lifetime rule are:

(6.9) — A temporary object bound to a reference parameter in a function call persists until the completion of the full-expression containing the call.

(6.10) — The lifetime of a temporary bound to the returned value in a function return statement is not extended; the temporary is destroyed at the end of the full-expression in the return statement.
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
PS: я знаю, что нужно поставить const в 19 строке, чтобы работало. Но зачем, почему?..
Иначе будет UB
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.08.2019, 00:18
Лучший ответ Сообщение было отмечено MJ_PRUTYG как решение

Решение

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это у майкрософта косяк, причём, по-моему, довольно старый.
это не косяк, а расширение компилятора.
о чем студия честно сообщает прямым английским текстом:

уровень предупреждений /W4

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <string>
 
::std::string some() { return "123"; }
 
int main()
{
    auto& ref = some();
    
    std::cout << ref << '\n';
}
Code
1
2
source_file.cpp(10): warning C4239: nonstandard extension used: 'initializing': conversion from 'std::string' to 'std::string &'
source_file.cpp(10): note: A non-const reference may only be bound to an lvalue
хочешь педантичное следование стандарту?
используй ключик /Za

Code
1
2
source_file.cpp(10): error C2440: 'initializing': cannot convert from 'std::string' to 'std::string &'
source_file.cpp(10): note: A non-const reference may only be bound to an lvalue
подобные ключи есть у всех нормальных компиляторов

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Нет смысла изменять временную переменную
есть великое множество различных кейсов,
когда это нужно.

в частности - паттерн "атомарный стрим"

проблема:
вывод в обычный std::cout не атомарный.
и вывод из нескольких тредов одновременно может превратить итоговый текст в кашу.

решение:
C++
1
atomic_stream(std::cout) << "ololo" << "tru la la" << '\n';
atomic_stream(std::cout) << value возвращает временный объект,
у которого перегружен operator<<
он скапливает внутри себя все поступающие данные.

когда завершается все выражение:
C++
1
atomic_stream(std::cout) << "ololo" << "tru la la" << '\n';
завершается время жизни этого временного объекта-буфера.
запускается его деструктор, где он под защитой мутекса
осуществляет вывод непосредственно в итоговый поток.

пример можно глянуть на SO (в самом конце PrintThread)

https://stackoverflow.com/ques... le-threads
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.08.2019, 00:18
Помогаю со студенческими работами здесь

Выражение должно быть допустимо для изменения левосторонним значением
Из-за чего появляется ошибка выражение должно быть допустимо для изменения левосторонним значением. struct vertex { float x, y, z,...

Выражение должно быть допустимым для изменения левосторонним значением
Здравствуйте! Подскажите, пожалуйста, в чем заключается ошибка и как ее исправить &quot;Выражение должно быть допустимым для изменения...

Выражение должно быть доступным для изменения левосторонним значением
Записываю имена подкаталогов в динамическую память globalfolders (WCHAR *globalfolders = new WCHAR) private: void getfolders(){ ...

Выражение должно быть допустимым для изменения левосторонним значением
Есть структура: struct Airport_Pass { int Distance; char Departur; char Destination; }; Чтобы инициализировать её в начале...

Выражение должно быть допустимым для изменения левосторонним значением
Size CyclicList::getItem(int n) { if (n &lt; 0) n += countItems; Size* current = first; for (int i = 0; i &lt; n; i++) current =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru