Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка для POD и OK для не-POD, left operand must be l-value 
V
    Опции темы
borisbn
Дата 25.5.2011, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



День добрый.
Интересует следующая ситуация:
Код

struct S {
    int x;
};
S foo_S() {
    return S();
}
int foo_int() {
    return 42;
}

int main()
{
    foo_S().x = 42; // OK
    foo_S() = S(); // OK
    foo_int() = 42; // error C2106: '=' : left operand must be l-value
    foo_int() = int(); // error C2106: '=' : left operand must be l-value
}

не подскажите, где в стандарте (хотя бы раздел, дальше - я сам) сказано, что не-POD типы можно использовать как возвращаемое значение ф-ции в левой части выражения, а POD - нельзя.
Спасибо.

Компилятор MSVC 2008.
P.S. проверил на LWS - получаю три ошибки - на все строки кроме
Код

    foo_S() = S(); // OK


P.P.S. Наверное, всё-таки, не POD и nonPOD, а собственные и встроенные. Ну вы поняли, о чём я  smile 

Это сообщение отредактировал(а) borisbn - 25.5.2011, 12:39


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 25.5.2011, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



borisbn, думаю, тебе надо читать про l-value и r-value в стандарте. Это к POD/nonPOD отношения не имеет.
думаю, стандартные типы возвращаются как const int.
PM   Вверх
borisbn
Дата 25.5.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(bsa @  25.5.2011,  13:43 Найти цитируемый пост)
думаю, тебе надо читать про l-value и r-value в стандарте

Почитал. Единственное, что нашёл - это
Цитата

The result of calling a function that does not return a reference is an rvalue. User defined operators are functions, and whether such operators expect or yield lvalues is determined by their parameter and return types.

Не факт, что это единственное, простоэто единственное, что я нашёл

Цитата(bsa @  25.5.2011,  13:43 Найти цитируемый пост)
Это к POD/nonPOD отношения не имеет.

 smile 
Цитата(borisbn @  25.5.2011,  11:11 Найти цитируемый пост)
P.P.S. Наверное, всё-таки, не POD и nonPOD, а собственные и встроенные. Ну вы поняли, о чём я 


Цитата(bsa @  25.5.2011,  13:43 Найти цитируемый пост)
думаю, стандартные типы возвращаются как const int.

Ввот это-то, как раз, и не понятно. В стандарте в разделе 3.10 ( Lvalues and rvalues ) вроде ничего такого не говорится. Разве что это
Цитата

Class rvalues can have cv-qualified types; non-class rvalues always have cv-unqualified types

но тут про rvalues говорится...
Наверное это отдано на откуп компилятора... что немного печалит :(


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
borisbn
Дата 25.5.2011, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



OK, закрываю, хотя ответ не получил, но это, скорее всего, из-за того, что вопрос не задал...
как умная собака - понимаю, что хочу, но сказать не могу smile

надо было перед тем, как создавать тему перечитать подпись bsa smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 26.5.2011, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  25.5.2011,  16:04 Найти цитируемый пост)
OK, закрываю, хотя ответ не получил, но это, скорее всего, из-за того, что вопрос не задал...

рано закрываете.. вопрос интересный.. несколько раз подходил к нему, но так и откладывал до лучших времен.. 




--------------------
PM MAIL WWW   Вверх
borisbn
Дата 26.5.2011, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



mes, надеюсь Вы понимаете, что я хотел спросить, а то у меня не получается даже вопрос сформулировать... что хочу выяснить - знаю, а задать вопрос -  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 26.5.2011, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  26.5.2011,  07:50 Найти цитируемый пост)
, надеюсь Вы понимаете, что я хотел спросить, а то у меня не получается даже вопрос сформулировать...

понимаю, но сформулировать также затрудняюсь.. smile


--------------------
PM MAIL WWW   Вверх
bsa
Дата 26.5.2011, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Думаю, сформулировать можно так: почему с rvalue работает один ряд операций, но не работает другой. И вообще можно ли это или undefined behaviour.
PM   Вверх
volatile
Дата 27.5.2011, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Хм.., а вроде-бы ответ уже сам borisbn и привел.
Цитата(borisbn @  25.5.2011,  14:11 Найти цитируемый пост)
The result of calling a function that does not return a reference is an rvalue. User defined operators are functions, and whether such operators expect or yield lvalues is determined by their parameter and return types.

Результалом вызова функции (для НЕ user defined типов), которая не возвращает ссылку - есть rvalue.
А для юзер дефайнед типов, определяется собственно самим юзером через возвращаемый тип. (is determined by their parameter 
and return types)

В данном случае S foo_S(); возвращает определенный юзером тип, и юзер определил что он не константный, сделовательно он lvalue.
а int foo_int(); возвращает уже совсем не определенный юзером тип, и он подпадает под первую часть:
Цитата

The result of calling a function that does not return a reference is an rvalue


В общем ключевым здесь является не вопрос "POD/не-POD", а вопрос "User defined/не-User defined"
Интуитивно я, по крайней мере, следую такому толкованию...

Нет?

PM MAIL   Вверх
borisbn
Дата 27.5.2011, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



volatile, спасибо, Вы, как всегда, умеете чётко сформулировать вывод.
Насколько я понял, это, всё-таки, implementation defined, т.к. вот это
Код
foo_S().x = 42; // OK

на студии компилится, а на gcc (LWS) - нет.

Цитата(volatile @  27.5.2011,  00:51 Найти цитируемый пост)
В общем ключевым здесь является не вопрос "POD/не-POD", а вопрос "User defined/не-User defined"


Цитата(borisbn @  25.5.2011,  11:11 Найти цитируемый пост)
P.P.S. Наверное, всё-таки, не POD и nonPOD, а собственные и встроенные. Ну вы поняли, о чём я






--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 27.5.2011, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  26.5.2011,  23:51 Найти цитируемый пост)
 и юзер определил что он не константный, сделовательно он lvalue.

const lvalue не есть rvalue..



--------------------
PM MAIL WWW   Вверх
volatile
Дата 27.5.2011, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(borisbn @  27.5.2011,  08:43 Найти цитируемый пост)
Насколько я понял, это, всё-таки, implementation defined, т.к. вот это
foo_S().x = 42; // OK
на студии компилится, а на gcc (LWS) - нет.

действительно
Цитата

source.cpp:13:17: error: using temporary as lvalue
Но тогда почему там компилится foo_S() = S() ?
имхо, тоже недолжно.
Вызывая огонь на себя фанов gcc, скажу что это очень похоже на глюк именно gcc.

Цитата(mes @  27.5.2011,  09:11 Найти цитируемый пост)
const lvalue не есть rvalue..

а я разве говорил что это не так?
PM MAIL   Вверх
borisbn
Дата 27.5.2011, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(volatile @  27.5.2011,  23:20 Найти цитируемый пост)
Вызывая огонь на себя фанов gcc, скажу что это очень похоже на глюк именно gcc.

нас двое на баррикадах smile. считаю это тоже глюком gcc, т.к. "назвался груздем полезай в кузов", т.е. если к temporary-объекту нельзя обращаться как к l-value, то уж нельзя... вот студия честно глючит: есть temporary-объект. его можно посчитать l-value, соответственно в него можно писать так же, как в члены его класса...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 28.5.2011, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  27.5.2011,  22:20 Найти цитируемый пост)
а я разве говорил что это не так? 

Цитата(volatile @  26.5.2011,  23:51 Найти цитируемый пост)
, и юзер определил что он не константный, сделовательно он lvalue.

если юзер определил бы его константным, то он также был бы lvalue, только const lvalue, a не rvalue..

Добавлено через 1 минуту и 15 секунд
т.е. lvalue/rvalue никак не зависят от указания юзером константности.. 
 


--------------------
PM MAIL WWW   Вверх
volatile
Дата 28.5.2011, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(volatile @  27.5.2011,  00:51 Найти цитируемый пост)
и юзер определил что он не константный, сделовательно он lvalue

Этой фразой я хотел только сказать что если юзер определил что он не константный, сделовательно его можно поставить с левой части от знака присваивания.

Но если рассматривать педантично, по критериям строгой терминологии С++, то mes, вы конечно-же,  как всегда абсолютно правы. Тем не менее, надеюсь, все поняли что я хотел сказать.  




Это сообщение отредактировал(а) volatile - 28.5.2011, 23:51
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0971 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.