Свежие комментарии
Title | Comment |
---|---|
Ну так вот окошки в RawDigger |
Ну так вот окошки в RawDigger оно и рисует. |
а qt зачем? оно же |
а qt зачем? оно же окошкориовалка? |
Сделаем и Win-x64. Не уверен, |
Сделаем и Win-x64. Не уверен, что будет работать на XP-x64, а на семерке должно. Но для этого надо Qt перекомпилировать (под 64 бита), руки пока не дошли. |
в том драфте стандарта что у |
в том драфте стандарта что у меня этот пункт (8.5.3.5) расчиркан разным цветом вдоль и поперёк :) |
После вызова func() ты во |
А в первом случае - не могу. Потому что нечего. И что теперь? Ну то есть идея про унификацию поведения с константами базовых типов - она понятная. Но какая-то дурацкая. |
Для структуры из двух полей |
Нет, не должно. std::string крайне не рекомендуется передавать по ссылке, если важна производительность и ссылка реально не нужна. ;-)
Слушай, ну стандарт! не-конст-ссылка не может указывать на 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) - объект. Откуда разница? |
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 ) { ... } Тот самый пример. |
Если совсем по-простому, то, судя по прототипу, 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; он сам умножит на два, а func вызовет только один раз. |
ну я же напомнил: "изменяли ли вы в программе значение конст |
ну я же напомнил: "изменяли ли вы в программе значение константы 4?" |
А какого хрена она const, если она временная? Отчего я не мо |
А какого хрена она const, если она временная? Отчего я не могу надругаться над ней как хочу? |
Ну казалось бы, warning. Вроде как на unused variable или на |
Ну казалось бы, warning. Вроде как на unused variable или на значение. А то прямо удивительное дело: в gcc это (неотключаемый?) error, а в MSVC я даже предупреждение в этом месте не могу включить (или не сумел). |
а вот кстати, про константу 4. сколько объектов будет создан |
а вот кстати, про константу 4. |
тут скорее не про "видеть", а про старую шутку "изменялили в |
тут скорее не про "видеть", а про старую шутку "изменялили вы значение константы 4?" |
потому что буква закона! а временная анонимная переменная ви |
потому что буква закона! ну придется тебе три раза написать const в этом примере... |
Cmake конечно не везде есть, |
Cmake конечно не везде есть, конечно добавлять его в зависимости - грешно, configure под Linux почти обязателен. Я же сужу с практической точки зрения: При этом, во втором случае, мне проекты были нужны независимые от путей на диске - и Qmake мне их сделала. Отчего я пребываю в полном незнакомстве с Cmake и очень рад, что могу что-то не знать |
Ну reference-то non-const. То есть теоретически функция func |
Ну reference-то non-const. То есть теоретически функция func может пытаться объект foo изменить. Он же на строку вперед не смотрит и не видит, что после вызова переменная сразу выходит из scope. А отследить что этот объект вообще неизменяемый - это ни у одного компилятора интеллекта не хватит, тем более, что автор описания объекта не пометил все public методы как const То есть вопрос тут не вида "на стеке или где мы там создаем объект", а в высокоуровневых терминах "функция теоретически может поменять этот объект, поэтому нельзя передавать туда объект, изменения в котором никак не удастся увидеть". |
Ааа. В стандарте наверняка |
Ааа. В стандарте наверняка написано точно, но мне кажется, что раз ф-ция берет не константную ссылку, то компилятор думает что она будет объект менять, а раз он временный то скорее всего девелопер допустил ошибку. Кто ж будет чего то менят, и не смотреть результат :) |
Pages
