Здравствуйте, igna, Вы писали:
I>Здравствуйте, drx, Вы писали:
drx>>A строка вида &EnumElement всегда приведёт к ошибке компиляции. I>Не приведет.
Извини, я, наверное, не совсем ясно выразился. Конечно, я имел ввиду следующий код:
В то время, как вызов foo( ENUM_ELEMENT ), скорей всего, разворачивается в что-то вроде foo( int( ENUM_ELEMENT ) ).
drx>>Таким образом, константа будет жить не только во время компиляции и "pure compile-time effect" пропадает. I>Разве нельзя точно также порассуждать по поводу enum?
Как видишь, нет
Здравствуйте, igna, Вы писали:
I>Согласен. Кстати, компилятору запрещено соптимизировать этот int, если он используется только как аргумент встраиваемой функции?
Ну оптимизировать некуда. У элемента перечисления нет адреса, так же как нет адреса у числового литерала, то есть в коде
первые два оператора совершенно эквивалентны, а последний позволяет использовать адрес static_const_value, что якобы может исключаеть CT-эффекты, что и не нравится...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, igna, Вы писали:
I>Здравствуйте, drx, Вы писали:
drx>>В то время, как вызов foo( ENUM_ELEMENT ), скорей всего, разворачивается в что-то вроде foo( int( ENUM_ELEMENT ) ). I>Разве для этого int( ENUM_ELEMENT ) не будет выделена (имеющая адрес) память?
Думаю, ты выразился ясно; это я, просто не ожидав, что ты имеешь ввиду именно не имеющую прямого отношения к рассматриваемому случаю операцию взятия адреса, подумал, что ты о том скрытом взятии адреса, которое осуществляет компилятор передавая функции с параметром int const& аргумент ENUM_ELEMENT.
Здравствуйте, Erop, Вы писали:
E>Ну оптимизировать некуда. У элемента перечисления нет адреса, так же как нет адреса у числового литерала, то есть в коде
первые два оператора совершенно эквивалентны, а последний позволяет использовать адрес static_const_value, что якобы может исключаеть CT-эффекты, что и не нравится...
Хорошо, у элемента перечисления нет адреса, но адрес есть у временной переменной, в которую копируется 5 или enum_element. Эта временная переменная может быть соптимизирована, если f встраиваемая. Почему точно также не может быть соптимизирована статическая константа?
Здравствуйте, igna, Вы писали:
I>Хорошо, у элемента перечисления нет адреса, но адрес есть у временной переменной, в которую копируется 5 или enum_element. Эта временная переменная может быть соптимизирована, если f встраиваемая. Почему точно также не может быть соптимизирована статическая константа?
потому, что у неё адрес уже есть.
Ну типа:
void f_impl( const int& );
void f( const int &i ) { f_impl( &i ); }
// Код
f( enum_item );
// эквивалентен такому:const int tmp = enum_item;
f_ptr( &tmp );
// а код
f( static_const_value );
// эквивалентен такому:
f_ptr( &static_const_value );
Совсем никто не обещал, что они будут оптимизироваться одинаково...
Мало того, часто реально неодинаково используются, например из asm'а
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Совсем никто не обещал, что они будут оптимизироваться одинаково...
А вот этого "одинаково" я и не утверждал; а лишь спрашивал, "запрещено ли компилятору соптимизировать этот int" (константу класса). То есть написано ли где-то в стандарте, что если такая константа используется как lvalue, то оптимизировать ее запрещено.