Свежие комментарии

Title Comment
Ну так вот окошки в RawDigger

Ну так вот окошки в RawDigger оно и рисует.

а qt зачем? оно же

а qt зачем? оно же окошкориовалка?

Сделаем и Win-x64. Не уверен,

Сделаем и Win-x64. Не уверен, что будет работать на XP-x64, а на семерке должно.

Но для этого надо Qt перекомпилировать (под 64 бита), руки пока не дошли.

в том драфте стандарта что у

в том драфте стандарта что у меня этот пункт (8.5.3.5) расчиркан разным цветом вдоль и поперёк :)

После вызова func() ты во

После вызова func() ты во втором случае можешь использовать f. То, что ты его НЕ ИСПОЛЬЗУЕШЬ -- это частности.

А в первом случае - не могу. Потому что нечего. И что теперь?

Ну то есть идея про унификацию поведения с константами базовых типов - она понятная. Но какая-то дурацкая.

Для структуры из двух полей

Для структуры из двух полей вероятно плевать, а если там std::string содержащий "Войну и Мир"? При передаче по значению оно же должно скопироваться?

Нет, не должно. std::string крайне не рекомендуется передавать по ссылке, если важна производительность и ссылка реально не нужна. ;-)

Внимание, вопрос: а что, собственно не нравится gcc?. Семантически, как я понимаю, разницы вообще никакой, на стеке создается объект типа foo, потом сразу помирает.

Слушай, ну стандарт! не-конст-ссылка не может указывать на rvalue. Семантически эти два куска очень различны. После вызова func() ты во втором случае можешь использовать f. То, что ты его НЕ ИСПОЛЬЗУЕШЬ -- это частности. Стандарт рассматривает отдельные сиквенс-пойнты. За точку-с-запятой он не заглядывает, и есть там использование f, нету его, или вообще там анричбл-код стандарт не волнует. MSVC++ умничает тут, проверяя что-то ПОСЛЕ оптимизатора. gcc проверять правильность типов ДО оптимизатора и не знает, что там дальше. И он прав.

__attribute__ ((pure))

__attribute__ ((pure))

<em>> Ну и соответственнно, вопрос - безымянный объект (не к

> Ну и соответственнно, вопрос - безымянный объект (не константу) - никак нельзя создать?

Не помню :( Давно не брал в руки шашки, совсем плохой стал.

Должно быть можно, automatic storage class переменной имя не нужно - на то она и automatic, что сама уничтожится, как время выйдет. Как на практике - не помню, совсем плохой стал.

OK, хорошо, пример с 2 катит, потому что исключения для базо

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

Что касается "имеет полное право не создавать" - что-то у меня сомнения. У меня же могут быть в конструкторе сайд-эффекты какие-то? Ну там запуск двигателя третьей ступени..... Посему - конструктор обязан позваться.

Ну и соответственнно, вопрос - безымянный объект (не константу) - никак нельзя создать?

С такими размерами RAW'ов

С такими размерами RAW'ов надо делать сразу x64 версию. Да и памяти уже, спасибо прожорливой w7, в фотографических машинках больше чем 4gb.

foo f(1,2) - объект с именем f. Automatic storage переменная

foo f(1,2) - объект с именем f. Automatic storage переменная.

foo(1,2) - константа. Без какого-либо storage class. Компилятор имеет полное право вообще не создавать никаких объектов для foo(1,2). А может и создать. Implementation dependent.

Не-не, эта логика мне кажется ущербной. foo f(1,2) - объект

Не-не, эта логика мне кажется ущербной.

foo f(1,2) - объект.
func(foo(1,2) - сразу константа.

Откуда разница?

upd. Редуцированный пример той же ошибки в http://alextutuba

upd. Редуцированный пример той же ошибки в http://alextutubalin.livejournal.com/293596.html?thread=4072924#t4072924

Не важно, это вопрос implementation. Важно, что foo(1,2) - э

Не важно, это вопрос implementation. Важно, что foo(1,2) - это константа.

На пальцах:

void foo( int & a ) { ... }
...
foo( 2 ); // ошибка времени компиляции

Тот самый пример.

Если совсем по-простому, то, судя по прототипу, func(foo&) м

Если совсем по-простому, то, судя по прототипу, func(foo&) может изменять аргумент. А foo(1,2) - это константа. Менять константу - плохо. Это не нравится GCC. Мне бы это тоже не понравилось, через code review такое я бы не пропустил (за исключением случаев "голова не варит").

foo(1,2) по стандарту rvalue, по нему же rvalue нельзя приве

foo(1,2) по стандарту rvalue, по нему же rvalue нельзя привести к lvalue. То есть правильно либо const foo& f, либо foo&& f и -std=c++0x. Это не UB, чтобы варнинги выдавать, gcc совершенно правильно ругается. clang его в этом, кстати, тоже поддерживает, это только msvc отличился, похоже.

ты главное в bar эту 4 поменяй. и два раза вызови, что бы по

ты главное в bar эту 4 поменяй.
и два раза вызови, что бы посмотреть что второму достанется.

Потому что C++ пытается изображать из себя язык высокого уро

Потому что C++ пытается изображать из себя язык высокого уровня, подчиняющийся некоей как бы математической логике. Поэтому результат выражения у него получается rvalue, которое по определению const.

А в стандарте там небось на этом месте undefined behavoir. В микрософте его решили определить так, как тебе кажется логичным, в GCC team по-другому.

Сразу вспоминается ван дер линденовская байка про реакцию на неопознанную #pragma в каком-то раннем gcc - запускать nethack, а если не найден, то rogue, с намеком "если у тебя в коде такое написано, ты сюда не программировать а играться пришел".

ну то есть по аналогии, что bar(int& ); bar(4); звать нельз

ну то есть по аналогии, что bar(int& ); bar(4); звать нельзя?

Интересно, а MSVC это сожрет, надо попробовать....

Видимо, классификацией ошибок по уровню в gcc team давно пер

Видимо, классификацией ошибок по уровню в gcc team давно перестали заниматься, полагая что все все равно используют -Werror.

таки да (по крайне мере частично)! только надо влепить синус

таки да (по крайне мере частично)!
только надо влепить синус например, что бы компилятор арифметику сам не посчитал и тогда для кода

int a;
a = func(foo(1,2));
return a+func(foo(1,2));

он сам умножит на два, а func вызовет только один раз.

ну я же напомнил: "изменяли ли вы в программе значение конст

ну я же напомнил: "изменяли ли вы в программе значение константы 4?"

А какого хрена она const, если она временная? Отчего я не мо

А какого хрена она const, если она временная? Отчего я не могу надругаться над ней как хочу?

Ну казалось бы, warning. Вроде как на unused variable или на

Ну казалось бы, warning. Вроде как на unused variable или на значение.

А то прямо удивительное дело: в gcc это (неотключаемый?) error, а в MSVC я даже предупреждение в этом месте не могу включить (или не сумел).

а вот кстати, про константу 4. сколько объектов будет создан

а вот кстати, про константу 4.
сколько объектов будет созданно, если func(foo(1,2)); будет употребленно более одного раза?
если один -- это многое объясняет.

тут скорее не про "видеть", а про старую шутку "изменялили в

тут скорее не про "видеть", а про старую шутку "изменялили вы значение константы 4?"

потому что буква закона! а временная анонимная переменная ви

потому что буква закона!
а временная анонимная переменная видимо создается как const.
что по этому поводу говорит стандарт -- я не знаю.
возможно такое поведение помогает отловить автоматически некоторое количество ошибок.

ну придется тебе три раза написать const в этом примере...

Cmake конечно не везде есть,

Cmake конечно не везде есть, конечно добавлять его в зависимости - грешно, configure под Linux почти обязателен.

Я же сужу с практической точки зрения:
- сделал ./configure - поток вопросов "а как мне собрать и поставить LibRaw на такой-то системе" упал почти до нуля (вот недавно про андроид было, но там проблема с shared lib versioning, оказалось там не все как у людей)
- положил в комплект проекты для Visual Studio 2008 - и этот поток вопросов ("как мне собрать под виндой мое приложение с вашей DLL") - упал до нуля.

При этом, во втором случае, мне проекты были нужны независимые от путей на диске - и Qmake мне их сделала.

Отчего я пребываю в полном незнакомстве с Cmake и очень рад, что могу что-то не знать

Ну reference-то non-const. То есть теоретически функция func

Ну reference-то non-const. То есть теоретически функция func может пытаться объект foo изменить.
Соответственно, если туда передана переменная, локальная в каком-то контексте, то компилятор имеет право надеяться, что в следующей строке после вызова эти изменения будут использованы.

Он же на строку вперед не смотрит и не видит, что после вызова переменная сразу выходит из scope.
Вот если параметр был бы const reference, тогда было бы понятно, что изменять его функция все равно не будет, и можно было бы его на стеке создавтаь.

А отследить что этот объект вообще неизменяемый - это ни у одного компилятора интеллекта не хватит, тем более, что автор описания объекта не пометил все public методы как const

То есть вопрос тут не вида "на стеке или где мы там создаем объект", а в высокоуровневых терминах "функция теоретически может поменять этот объект, поэтому нельзя передавать туда объект, изменения в котором никак не удастся увидеть".

Ааа. В стандарте наверняка

Ааа. В стандарте наверняка написано точно, но мне кажется, что раз ф-ция берет не константную ссылку, то компилятор думает что она будет объект менять, а раз он временный то скорее всего девелопер допустил ошибку. Кто ж будет чего то менят, и не смотреть результат :)

Pages

Subscribe to comments_recent_new