Почему семантика перемещения C ++ оставляет исходный код созданным?

Я также разместил этот ответ в stackoverflow - Обработка ошибок в вызовах getJSON

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

Структура getJSON выглядит следующим образом (см. http://api.jqueri.com ):

$(selector).getJSON(url,data,success(data,status,xhr))

большинство людей реализуют это с помощью

$.getJSON(url, datatosend, function(data){
    //do something with the data
});

, где они используют url var для предоставления ссылки на данные JSON, datatosend как место для добавления "?callback=?" и других переменных, которые должны быть отправлены для получения правильных данных JSON, а функция успеха - как функция обработки данных.

Однако вы можете добавить статус и переменные xhr в свою функцию успеха. Переменная состояния содержит одну из следующих строк: «success», «notmodified», «error», «timeout» или «parsererror», а переменная xhr содержит возвращаемый объект XMLHttpRequest (, найденный в w3schools ])

$.getJSON(url, datatosend, function(data, status, xhr){
    if (status == "success"){
        //do something with the data
    }else if (status == "timeout"){
        alert("Something is wrong with the connection");
    }else if (status == "error" || status == "parsererror" ){
        alert("An error occured");
    }else{
        alert("datatosend did not change");
    }         
});

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

Надеюсь, что это помогает кому-то по-прежнему искать ответ на этот вопрос.

24
задан Howard Hinnant 31 October 2015 в 18:25
поделиться

1 ответ

В «вселенной операций перемещения» есть четыре возможности:

target          source
  is            is left
----------------------------------------------------------
constructed <-- constructed  // C++11 -- move construction
constructed <-- destructed
assigned    <-- constructed  // C++11 -- move assignment
assigned    <-- destructed

Каждая из этих операций полезна ! std::vector<T>::insert один может использовать первые три. Хотя обратите внимание:

  • Источник 2-го и 4-го не должен иметь автоматического, статического или потокового хранения. Срок хранения источника должен быть динамическим, иначе компилятор вызовет деструктор для уже разрушенного объекта. И нет, компилятор не может (в общем) отслеживать, если объект был перемещен из:

X x1, x2;
if (sometimes)
{
    x1 = std::move(x2);
}
// Is x2 moved-from here?

  • 2-й и 4-й могут быть эмулированным 1-м и 3-м соответственно, просто вручную вызывая деструктор на источнике после операции.

  • 1-й и 3-й имеют решающее значение. Алгоритмы типа std::swap и std::sort регулярно нуждаются в обеих этих операциях. Этим алгоритмам не нужно разрушать ни один из их входных объектов & mdash; только меняйте их значения.

Вооружившись этими знаниями, в период 2001-2002 гг. Я сосредоточил свои усилия на двух операциях, которые оставили свой исходный код созданным, потому что эти две операции оказали бы наибольшее (положительное) влияние на то, что тогда было C ++. 98. В то время я знал, что если я не сверну амбиции этого проекта, то он никогда не будет успешным. Даже ограниченный, он был слишком амбициозным, чтобы добиться успеха.

Это сокращение признано в первоначальном предложении семантики перемещения в разделе, озаглавленном «Семантика разрушительного движения».

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

Подробнее о том, что можно делать с перемещенным объектом, см. https://stackoverflow.com/a/7028318/576911

.
26
ответ дан Community 31 October 2015 в 18:25
поделиться
Другие вопросы по тегам:

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