Почему некоторые компиляторы c ++ позволяют вам брать адрес литерала?

Компилятор C ++, который я не назову, позволяет вам взять адрес литерала, int * p = & 42;Очевидно, что 42 - это r-значение, и большинство компиляторов отказываются это делать.Зачем компилятору это позволять?Что вы могли бы сделать с этим, кроме как выстрелить себе в ногу?
4 голоса | спросил S I 22 J000000Wednesday09 2009, 20:06:58

5 ответов


0
Что если вам нужен указатель на целое число со значением 42?:)Ссылки на C ++ очень похожи на автоматически разыменовываемые указатели.Можно создать постоянную ссылку на литерал, например так:Это фактически требует, чтобы компилятор инициализировал указатель с адресом целого числа со значением 42, как вы могли бы впоследствии сделать это:Объедините это с тем фактом, что компиляторы должны иметь логику, чтобы различать значение, для которого не был взят адрес, и значение, для которого оно известно, чтобы хранить его в памяти.Первый не обязательно должен иметь место в памяти, поскольку он может быть полностью временным и храниться в регистре или может быть устранен путем оптимизации.Взятие адреса значения потенциально может привести к появлению псевдонима, который компилятор не может отследить, и запрещает оптимизацию.Таким образом, применение оператора ---- +: = 2 =: + ---- может заставить значение, каким бы оно ни было, в памяти.Так что, возможно, вы нашли ошибку, которая объединила эти два эффекта.
ответил Barry Kelly 22 J000000Wednesday09 2009, 20:20:14
0
Потому что 42 - это ответ на жизнь, вселенную и все.Когда спрашивают его адрес, это сам ответ.
ответил DaClown 22 J000000Wednesday09 2009, 20:12:27
0
Слегка язык (отнюдь не полностью) в щеке:Я бы сказал, что в коде приложения C ++ получение адреса целого числа, будь то lvalue или rvalue, почти всегда является ошибкой.Даже используя целые числа, выполнение чего-либо гораздо большего, чем управление циклами или подсчетом, вероятно, является ошибкой проектирования, и если вам нужно передать целое число в функцию, которая может его изменить, используйте ссылку.
ответил 22 J000000Wednesday09 2009, 20:26:01
0
Нашел что-то связанное с ссылками на rvalue в C ++ 0x - семантика перемещения http://www.artima.com/cppsource/rvalue.html
ответил S I 24 J000000Friday09 2009, 11:09:35
0
Это эффективно требует, чтобы компилятор инициализировал указатель с адресом целого числа со значением 42Тогда почему в некоторых компиляторах мы не можем получить адрес литерала напрямую ?Ссылка:это почти то же самое, что указатель, хотя ...
ответил user271311 11 FebruaryEurope/MoscowbThu, 11 Feb 2010 22:13:28 +0300000000pmThu, 11 Feb 2010 22:13:28 +030010 2010, 22:13:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132