Итак, мы столкнулись с провальным тестом в Linux, который, как я полагаю, связан с неверными предположениями с моей стороны относительно правильности указателей, ссылающихся на встроенные литералы. Код выглядит аналогично этому псевдокоду:
auto obj = func( 'c', "str" ); // (1)
big_type big_object; // (2)
В (1) func()
возвращает объект, в котором хранится указатель const
на символьный литерал и один на строковый литерал. Проверка в отладчике показывает, что оба верны.
В (2) отладка показывает, что то, что раньше было 'c'
в памяти, на которую ссылается const char*
в obj
, перезаписывается.
Теты показывают, что это также происходит с литералами int
и double
. Это происходит в GCC 5.4.1, это не происходит в GCC 4.1.2.
Проработав C ++> 25 лет, я научился предполагать, что компилятор обычно прав, а я неправ; так что я делаю это и здесь.
Однако, хотя я знаю, что, если это касается только литералов небольших встроенных типов, я могу это исправить (скопировав их вместо ссылки на них), если это может произойти с объектами произвольного размера ("str"
) а у нас довольно большая проблема.
Так может кто-нибудь, пожалуйста, объясните точные правила относительно этого?