Почему невозможно иметь ссылку на пустоту?

Просто используйте return вместо continue. Этот return возвращается из блока сценария, который вызывается ForEach-Object на конкретной итерации, таким образом, он имитирует continue в цикле.

1..100 | ForEach-Object {
    if ($_ % 7 -ne 0 ) { return }
    Write-Host "$($_) is a multiple of 7"
}

Это вопрос, который нужно сохранить в виду рефакторинга. Иногда хочется преобразовать блок оператора foreach в конвейер с командлетом ForEach-Object (у него даже есть псевдоним foreach, который помогает легко сделать это преобразование и сделать ошибки тоже). Все continue следует заменить на return.

P.S. К сожалению, не так легко имитировать break в ForEach-Object.

37
задан Luc Touraille 19 January 2009 в 15:54
поделиться

10 ответов

Если бы у Вас действительно была ссылка на пустоту, что Вы сделали бы с нею? Это не было бы число, или символ, или указатель или что-либо как этот. Ваша гипотетическая родовая функция не могла выполнить операцию на нем, кроме взятия ее адреса (и не ее размера).

"пустой" имеет два использования: отрицать любое знание типа (как в пустоте *), и ничего не определить в противоположность чему-то (освобождают функциональный возврат). Ни в том, ни в другом случае он возможный сказать что-либо о пустоте что-то за исключением того, что это может иметь адрес.

, Если Вы не можете думать о пути, что-то может быть полезным, и я не могу, который является, по крайней мере, доказательством, что что-то бесполезно, и это может быть, по крайней мере, частью объяснения здесь.

38
ответ дан David Thornley 19 January 2009 в 15:54
поделиться
  • 1
    +1, потому что it' s нормальный ответ. Я дал бы другому, потому что Вы сделали это в Perl, но к сожалению мне can' t:) Спасибо! – Sklivvz 17 October 2008 в 00:00

Спросите Ваш сам сначала, как Вы разыменовали бы пустой указатель?

void *p = /*something*/ ;
cout << *p << endl;

вышеупомянутый код бессмыслен, одна из причин, которые мы имеем пусто, так, мы можем сказать, что "Я должен сделать некоторую универсальную работу указателя здесь и меня ни знать, ни заботиться о том, на что я указываю". По определению компилятор не знает то, на что указывает пустота *, поэтому это не может разыменовать его. Вы можете - путем кастинга - но компилятор не может.

ссылка А на пустоту страдает от той же проблемы, по определению данные указали, не имеет типа, поэтому на это нельзя сослаться никаким значимым способом.

Для ссылки на него Вы - программист - должен бросить его к другому типу, тогда у Вас может быть типизированная ссылка на него.

Не уверенный, если я объяснил это, а также я хотел.

Ruben, какие-либо мысли?

РЕДАКТИРОВАНИЕ: Для ответа на редактирование.

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

logger << data;

и Вы поймете мысли адресных сведений к. При попытке разыменовать данные, компилятор даст Вам ошибку (не имейте компилятора C++ удобным в настоящее время, таким образом, не уверенный в фактической ошибке). например,

void* data = /* some assignment */;
logger << *data; // compiler error.

Теперь, компилятор не позволит Вам разыменовать пустоту* по любой причине (это не имеет смысла), то же выдерживает за ссылку освободить & данные, за исключением того, что, потому что это - ссылка , они неявно разыменовываются все время . Компилятор не позволит Вам разыменовать пустоту* на одной операции, он не собирается позволять Вам постоянно разыменовывать его.

void& data = /* some assignment *.;
logger << data; // means same as logger << *data above

Вы не можете сделать , ЧТО-НИБУДЬ к данным КРОМЕ [1 120] берет, это - адрес, и существует совершенно хорошее - и безопасно - метод, встроенный в languge, чтобы сделать это, т.е.

void* data;

это имеет еще смысл?

14
ответ дан Binary Worrier 19 January 2009 в 15:54
поделиться
  • 1
    +1, потому что Sklivvz didn' t имеют второе голосование для предоставления:-), – stevemegson 17 October 2008 в 01:07

Ссылка является ссылкой на экземпляр чего-то. Экземпляр чего-то не может иметь типа void. Любой экземпляр чего-то должен иметь определенный тип (и возможно базовые типы).

6
ответ дан ChrisW 19 January 2009 в 15:54
поделиться
  • 1
    Другое голосование за грубую силу. Проблема является достаточно небольшой, который это применяет и работает вполне хорошо. – Nick Johnson 17 October 2008 в 07:46

Вот сводка разных вещей, которые были сказаны, и что я думал.

Две главных причины, почему ссылка на пустоту запрещена

<час>

1 , Они были бы полностью бесполезны.

Действительно, если мы оглядываемся назад во времена C, пустые указатели имели две цели:

  • управление памятью (например, malloc)
  • Степень универсальности (пишущий функции, которые могут принять любой тип аргументов)

, Когда C++ вышел, шаблоны стали лучшим решением реализовать степень универсальности. Однако пользовательское управление памятью все еще должно было быть возможным, и совместимость между C++, и C был главным беспокойством, таким образом, пусто* был сохранен. Гипотетическая пустая ссылка не имела бы справки с управлением памятью, и степень универсальности уже охвачена, так в основном это имело бы почти быть бесполезное (за исключением гарантии непустых описанным ниже).

2 Вы не были бы в состоянии сделать что-либо с ним

При использовании пустого указателя, Нельзя разыменовать его; транспонированный к случаю ссылок, который означает, Вы не можете использовать (всегда гипотетический) пустая ссылка. Так

void *data = // something
// using *data and data-> is forbidden

void &data = // something
// using data is forbidden

Однако мы могли думать о варианте использования, где ссылка не должна будет быть "разыменована" (эта фраза является ужасно неправильной, но Вы понимаете мою мысль), но где мы только взяли бы ее адрес. Давайте предположим, что у меня есть следующая функция:

void foo(void *dataptr)
{
    assert(dataptr != NULL); // or != 0
    // do something with dataptr
}

Для предотвращения этого раздражения утверждают, я мог записать функции этот путь:

void foo(void &dataref)
{
    void *data = &dataref;
    // do something with data
}

Однако для этого для работы, &dataref потребности быть эквивалентным dataptr, , который не имеет место : &dataref эквивалентно &*dataptr!

Поэтому даже взятие адреса подразумевает разыменование, по крайней мере, концептуально (негласно, первая эквивалентность, вероятно, верна, но на семантическом уровне это не). Следовательно, нет абсолютно никакого использования, которое мы можем сделать из данных, таким образом, пустые ссылки являются аберрацией.

3
ответ дан Luc Touraille 19 January 2009 в 15:54
поделиться
  • 1
    Грубая сила обычно совершает нападки стена приблизительно в n=10 (зависит от варианта использования). Вещь даже при удвоении вычислительной мощности стена едва перемещается. Умные формы грубой силы (отслеживание в обратном порядке, сокращая) и т.д. могут переместить стену в n=20, но не далее. По моему опыту, Запрещенное Поисковое и Последнее Принятие работы лучше всего (намного лучше, чем Генетические алгоритмы). – Geoffrey De Smet 20 June 2013 в 10:12

С технической точки зрения все, что гарантируется, - то, что ссылка на объект является псевдонимом для него. Это при ссылочной передаче параметров капота сделано с указателями, деталь реализации. Это может сбивать с толку из-за ссылок, снова использующих & оператор, который является также адресом - но имеет в виду, что оператор на самом деле имеет различные значения в различных контекстах (в объявлении переменной или объявлении параметра это обозначает ссылочный тип, иначе это - адрес - кроме тех случаев, когда это является поразрядным - и). Поскольку это - технически просто псевдоним для объекта, ссылка 'всегда разыменовывается' как объясненный Worrier.

2
ответ дан Joseph Garvin 19 January 2009 в 15:54
поделиться

Можно думать о ссылке как о разыменованном указателе. Синтаксически Вы рассматриваете ссылку, как будто это не указатель: Вам не нужно * оператор для разыменования его, и можно использовать. вместо-> для доступа к его участникам.

Однако Вы не можете разыменовать void указатель. Как указано Двоичным Worrier, пытающимся сделать, который даст Вам ошибку компилятора. И если у Вас не может быть разыменованного пустого указателя, который означает, что у Вас не может быть пустой ссылки.

0
ответ дан Dima 19 January 2009 в 15:54
поделиться
  • 1
    Я don' t соглашаются. Я думаю что гибрид между CP - ИЛИ и затем возможно, AI. Я видел хорошие академические универсальные решения с CP - ИЛИ соединение, но эта область исследования никогда не получает денег, таким образом, кажется, что мы обречены. – Jonke 26 October 2008 в 01:34

Если бы они были, они семантически не дифференцировались бы от указателей и составили бы синтаксический сахар. Ссылка говорит, "Я обращаюсь к чему-то, что имеет этот тип". Разрешение пусто или нулевая ссылка ослабило бы то различие от указателей.

Предоставленный, для ссылки все еще возможно относиться к объекту, который больше не существует, но это - исключение.

0
ответ дан JohnMcG 19 January 2009 в 15:54
поделиться
  • 1
    Количество головок было бы зафиксировано (скажите x классы y студентов). Все учителя одинаково сертифицированы. По крайней мере, в итальянских школах, который является...;) – Sklivvz 16 October 2008 в 23:49

пустой что-то, что, по определению, не существует, таким образом, не логично иметь, это - адрес.

-2
ответ дан dmajkic 19 January 2009 в 15:54
поделиться
  • 1
    Ya, исключение тех ограничений упрощает вещи. Я думаю, садясь, и рисование изображения возможных структур данных для ограничений было бы хорошим шагом. Сделайте часть, которую Вы знаете, и остальные могут стать видимыми. – EvilTeach 16 October 2008 в 23:54

ОК, меня беспокоит одна вещь. Идея void * , как упоминалось выше, состоит в том, что у вас все еще есть допустимая переменная, содержащая адрес, но тип игнорируется. Это кажется допустимым, поскольку мы все еще можем работать с адресными данными - тип в этом контексте несколько избыточен (или менее важен). Разыменование это плохо, потому что попытаться получить доступ к члену не имеет смысла, например, p.mem . Мы не знаем, к какому классу обращаться, и, следовательно, к памяти, к которой нужно переходить, к указателям vtable, которым нужно следовать.

Однако, это ' Затем, кажется, имеет смысл, что p сам по себе будет в порядке, поскольку он будет ссылаться только на объект, но не на его данные. Для этого не требуется информация о классе, только адрес. Я понимаю, что это абсолютно бесполезно, но важно определить, когда что-то сломалось. Допуская это понятие, также имеет смысл ссылка на C ++ (постоянно разыменовываемая, но не имеющая доступа к чему-либо), например, void & ref = static_cast <& void> (obj) и, следовательно, допускает ссылки на void. Я не говорю, что кто-то должен обсуждать это с ответственными лицами, но с точки зрения «осмысления», это было бы правильно, не так ли?

Как указывал Люк Турайль выше (по крайней мере, это мой интерпретация), это может быть реализовано, но проблема является семантической. Разумное объяснение, к которому я мог прийти, заключалось в том, что, поскольку переменная объекта является «тегом» для последовательности памяти, тип имеет важное семантическое значение. Таким образом, указатель, рассматриваемый как переменная со значением адреса, рассматривает тип как несколько избыточный, а не ключ к его определению.

Кто-нибудь с этим согласится?

1
ответ дан 27 November 2019 в 02:41
поделиться

Ниже не защита понятия недействительных ссылок. Я предлагаю это как анекдот из дикой природы. Спросите себя, не пахнет ли это смешно.

Моя компания была одной из первых, кто использовал C ++ на коммерческой основе, и первоначально скомпилировал с использованием Cfront . Ранние разработчики все еще изучали язык и обычно использовали все приемы в книге (операторы везде!). Вот трюк, который они сочли классным:

void Foo::something(int action, ostream &os = *(ostream *)0)
{
   ostream *os_p = &os;
   if (&os == (ostream *)0) {
      os_p = &cerr;
   }
   // continue with method
}

Итак, у вас есть не ссылка на void, а типизированная ссылка с потенциально привязкой void ! Мгновенная мысль, вероятно, должна предложить лучшие альтернативы этой конкретной идиоме ...

0
ответ дан 27 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

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