Почему shared_ptr NULL после броска [duplicate]

Я хотел бы добавить одну вещь к отличному ответу chazomaticus :

Не забудьте также тег META (например, или HTML4 или XHTML-версия этого файла ):


Это кажется тривиальным, но IE7 дал мне проблемы с этим раньше.

Я делал все правильно; база данных, соединение с базой данных и HTTP-заголовок Content-Type были настроены на UTF-8, и она отлично работала во всех других браузерах, но Internet Explorer по-прежнему настаивал на использовании «западноевропейской» кодировки.

It оказалось, что на странице отсутствует метка META. Добавление этого решения проблемы.

Правка:

У W3C фактически есть довольно большой раздел , посвященный I18N . У них есть ряд статей, связанных с этой проблемой & ndash; описывая HTTP, (X) HTML и CSS сторону вещей:

Они рекомендуют использовать как HTTP-заголовок, так и HTML метатег (или объявление XML в случае XHTML служил XML).

19
задан asaelr 5 June 2013 в 12:39
поделиться

2 ответа

В данном случае это, вероятно, ошибка компилятора, потому что после этого ссылается на переменную (и перемещается из нее).

В общем случае вызов move throw концептуально совпадает с перемещением return. Хорошо вызывать движение автоматически, когда известно, что переменная не может быть указана после данной точки (throw или return).

5
ответ дан Juraj Blaho 27 August 2018 в 04:48
поделиться

Стандарт C ++ говорит (15.1.3):

Выбрасывание исключения copy-initializes (8.5, 12.8) - временный объект , называемый объектом исключения. Временной является значением lvalue и используется для инициализации переменной, указанной в соответствующем обработчике (15.3).

Этот параграф может также иметь значение здесь (12.8.31):

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

(...)

- в выражении throw , когда операнд - это имя энергонезависимого автоматического объекта (кроме параметра функции или параметра catch-clause) , объем которого не выходит за пределы самой внутренней прилагаемой попытки -block (если есть) , операция копирования / перемещения из операнда в объект исключения (15.1) может быть опущена путем создания автоматического объекта непосредственно в объект исключения

Проверено в Visual Studio 2012, эффект:

Exception!
blabla

Похоже на ошибку в GCC.

7
ответ дан Spook 27 August 2018 в 04:48
поделиться
Другие вопросы по тегам:

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