GetSmart 0 24 января, 2016 Опубликовано 24 января, 2016 (изменено) · Жалоба Любой выполняющий требования стандарта. То есть по стандарту индекс можно применять к rvalue? Уточняю. Или по-другому заявлено? Это с чистого как слеза Си так задумано? Изменено 24 января, 2016 пользователем GetSmart Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 24 января, 2016 Опубликовано 24 января, 2016 · Жалоба То есть по стандарту индекс можно применять к rvalue? Причем тут все это? Просто foo2( "ABCD" ); это, естественным образом, абсолютно тоже самое, что char str[] = "ABCD"; foo2( str ); Смотрится, конечно, страновато, но законно. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 132 24 января, 2016 Опубликовано 24 января, 2016 · Жалоба То есть по стандарту индекс можно применять к rvalue? Уточняю. Или по-другому заявлено? Это с чистого как слеза Си так задумано?Если речь идет о записи "строковый литерал"[индекс], то да - это чистый, как слеза Си. Строковый литерал неявно приводится к указателю на char const, а для указателя определены индексные операции, которые есть адресная арифметика. Отсюда в чистом как слеза Си возможно и такая запись: i["abcdef"]. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 24 января, 2016 Опубликовано 24 января, 2016 (изменено) · Жалоба Смотрится, конечно, страновато, но законно. Незаконно. Классификация lvalue/rvalue (ака переменная/значение) не позволяет такие вольности. По логике, это как взять адрес от значения. Бред. Компилятор должен ругаться на этапе компиляции. Строковый литерал неявно приводится к указателю на char const В стандарте чёрным по белому написано, что прямо внутри разбора выражения? Логично когда оно преобразуется после завершения выражения. Как и с приведением имени массива. Применение амперсанда к массиву естественно, по аналогии со всеми остальными переменными. Изменено 24 января, 2016 пользователем GetSmart Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 24 января, 2016 Опубликовано 24 января, 2016 · Жалоба "ABCD" не является rvalue, строго говоря. Это константа, для которой отведено место в памяти, значит и адрес можно брать, и индекс. А rvalue не видны за пределами выражения, в котором они используются. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 24 января, 2016 Опубликовано 24 января, 2016 · Жалоба Классификация lvalue/rvalue (ака переменная/значение) не позволяет такие вольности. покажите каким образом "ABCD" по-вашему является rvalue, со ссылкой-цитатой на стандарт. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 24 января, 2016 Опубликовано 24 января, 2016 (изменено) · Жалоба "ABCD" не является rvalue, строго говоря. Это константа, для которой отведено место в памяти, значит и адрес можно брать, и индекс. А rvalue не видны за пределами выражения, в котором они используются. И сложение rvalue-строк на этапе компиляции отменили? покажите каким образом "ABCD" по-вашему является rvalue, со ссылкой-цитатой на стандарт. Вообще-то очевидно, что оно есть rvalue. А вот когда происходят неявные преобразования это другой вопрос. Оно не может происходить сразу по завершающим кавычкам. По аналогии с массивом, применение индекса к имени массива не вызывает неявное преобразование. Не видно оснований почему к строке оно должно вызывать. Изменено 24 января, 2016 пользователем GetSmart Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 24 января, 2016 Опубликовано 24 января, 2016 · Жалоба покажите каким образом "ABCD" по-вашему является rvalue, со ссылкой-цитатой на стандарт. Вообще-то очевидно, что оно есть rvalue. нет. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 24 января, 2016 Опубликовано 24 января, 2016 (изменено) · Жалоба Дополнил конец пред поста. Изменено 24 января, 2016 пользователем GetSmart Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 24 января, 2016 Опубликовано 24 января, 2016 · Жалоба Вообще-то очевидно, что оно есть rvalue. А вот когда происходят неявные преобразования это другой вопрос. Оно не может происходить сразу по завершающим кавычкам. По аналогии с массивом, применение индекса к имени массива не вызывает неявное преобразование. Не видно оснований почему к строке оно должно вызывать. Дополнил конец пред поста. разницы не вижу. ни ссылок, ни цитат, зато бушует подмена стандарта вашими "понятиями", "аналогиями" и якобы "очевидностями". Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 132 24 января, 2016 Опубликовано 24 января, 2016 · Жалоба В стандарте чёрным по белому написано, что прямо внутри разбора выражения?Да, как и все остальные неявные приведения типов. И сложение rvalue-строк на этапе компиляции отменили?Это как? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 24 января, 2016 Опубликовано 24 января, 2016 (изменено) · Жалоба Это как? foo2( "ABCD" + "XYZ" ); Неявное преобразование происходит строго после полного завершения выражения - первого аргумента функции. Изменено 24 января, 2016 пользователем GetSmart Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 24 января, 2016 Опубликовано 24 января, 2016 · Жалоба foo2( "ABCD" + "XYZ" ); Неявное преобразование происходит строго после полного завершения выражения - первого аргумента функции. C дуба рухнули? Здесь Вам не Паскаль. Здесь, если хочется, то foo2( "ABCD" "XYZ" ); И это из другой оперы. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 132 24 января, 2016 Опубликовано 24 января, 2016 · Жалоба foo2( "ABCD" + "XYZ" );Я даже скомпилил от неожиданности. Не, все нормально: char const * a = "ab" + "cd"; Compiling: test.c test.c:2:23: error: invalid operands to binary + (have 'char *' and 'char *') char const * a = "ab" + "cd"; ^ Вы в следующий раз проверяйте перед тем как писать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 24 января, 2016 Опубликовано 24 января, 2016 (изменено) · Жалоба Если строки складываются без плюса, то я не сильно ошибся. Загвоздка собственно в приоритете неявного преобразования при разборе выражения. Но я упустил аналогию с применением индекса к lvalue-указателю, который вызывает неявное преобразование раньше индексирования. Против такого козыря у меня ничего нет. Недоглядел. Паскалем балуюсь, немножко :) Изменено 24 января, 2016 пользователем GetSmart Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться