res2001,
>RVO во всей красе. Отключите эту оптимизацию и получите совсем другой код.
Точно, option -O, спасибо.
>Да вроде можно. Убрал const в вашем примере и все нормально.
struct s & ref = f();
error: cannot bind non-const lvalue reference of type 's&' to an rvalue of type 's'
A temporary can not bind to a non-const reference. Нет, не могли вы просто убрать, это временный объект, всё же. Да и чего сомнительного, ведь копирующий конструктор работает по тому же принципу.
> Вообще сомнительная конструкция
Просто читаю Эккеля, учу ссылки и всё с ними связанное, пытаюсь разобраться.
Потому что исходные коды с компилятором и объектный файл со средой выполнения - разные сущности с разными этапами и возможностями. Компиляторы С не беспокоятся о том, по какому адресу будет пытаться обратиться программа в среде выполнения, их волнуют только свои внутренние правила (и реакция на нарушение этих правил различна - от warning до error в зависимости от компилятора и ключей).
Например, типы у переменных (сущностей, объектов, идетификаторов, как угодно) должны соответствовать. Но бывают странные исключения, что можно инициализировать указатель на non-const char с помощью адреса строки, которая может размещаться компилятором в read-only памяти ( char * ptr = "hello" ; ). Передача non-const сущности в const сущность разрешима несмотря на разные типы (то есть компилятор согласиться выполнить приведение типов), потому что это не может что-то сломать. void B( const char * ptr[] ) будет преобразована в void B( const char * * ptr ), а вот noncon имеет тип char * [4] (т.е. массив из 4 указателей на char).
Потому что исходные коды с компилятором и объектный файл со средой выполнения - разные сущности с разными этапами и возможностями. Компиляторы С не беспокоятся о том, можно ли или нельзя ли обратиться по какому-то адресу, их волнуют только свои внутренние правила. Например, типы у переменных (сущностей, объектов, идетификаторов, как угодно) должны соответствовать. Под MAS, &MAS и &MAS[0] скрывается одно и то же значение, но тип данных у MAS и &MAS - разный, что и не устраивает компилятор.
TheCalligrapher, хоть на вопрос это не отвечает, но спасибо про -lm. Не заметил, что "во многих системах Linux/UNIX компилятору необходимо также передать флаг -lm (например: gcc -lm fig04_06.c), чтобы программа из примера 4.4 скомпилировалась. Этот флаг обеспечивает компоновку программы с математической библиотекой."
\\192.168.1.34
Ага, спасибо, буду знать. Мне тоже не ясно, я просто помнил, что через домашнюю группу эта задача решалась. Наверняка есть не такой ламерный способ.
>RVO во всей красе. Отключите эту оптимизацию и получите совсем другой код.
Точно, option -O, спасибо.
>Да вроде можно. Убрал const в вашем примере и все нормально.
struct s & ref = f();
error: cannot bind non-const lvalue reference of type 's&' to an rvalue of type 's'
A temporary can not bind to a non-const reference. Нет, не могли вы просто убрать, это временный объект, всё же. Да и чего сомнительного, ведь копирующий конструктор работает по тому же принципу.
> Вообще сомнительная конструкция
Просто читаю Эккеля, учу ссылки и всё с ними связанное, пытаюсь разобраться.