LINUX.ORG.RU

[C++] исключения, копирование

 


0

1

имеется следующий код:

#include <iostream>

using namespace std;

struct X {
    X() {
        cout << "X()\n";
    }
    X(X&) {
        cout << "X(X&)\n";
    }
    ~X() {
        cout << "~X()\n";
    }
};

int main()
{
    try {
        try {
            X x;
            throw x;
        }
        catch (X& x) {
            cout << "1\n";
            throw;
        }
    }
    catch(X) {
        cout << "2\n";
    }
    return 0;
}
вот что он выводит:
X()
X(X&)
~X()
1
X(X&)
2
~X()
~X()

гцц почему то копирует X при входе в catch(X). msvc не копирует.

Почему гцц ведет себя в этом случае как при catch(X x)? Как это должно работать?

В Страуструпе сказано о том что при throw копирование обязательно происходит, но про catch он как-то умалчивает.


GCC ведет себя строго по стандарту. Сигнатура подразумевает копирование. Я, кстати, уверен что MSVC просто оптимизирует. Легко проверить - сделай конструктор копирования закрытым и посмотри, как компилятор надает тебе по рукам.
Кстати, ловить исключения по значению - дурной тон.

Vamp
()
Ответ на: комментарий от Vamp

Спасибо. Да он действительно ругается на строчку catch(X), если конструктор копирования в привате.

Dimson
() автор топика
Ответ на: комментарий от Vamp

Выкинь книжку, где ты про это читал на помойку. Или подотрись ей. Тебя обманули.

class exception {
public:
  exception () throw();
  exception (const exception&) throw();
  exception& operator= (const exception&) throw();
  virtual ~exception() throw();
  virtual const char* what() const throw();
}

как бы прям напрашивается. Но конечно не кто не заставляет.

Cupper
()
Ответ на: комментарий от Cupper

в данном примере это неважно. но более правильно по константной, да

Dimson
() автор топика
Ответ на: комментарий от Vamp

Сигнатура подразумевает копирование. Я, кстати, уверен что MSVC просто оптимизирует.

в msvc прокачано rvalue optimization - возможно дело в этом, к сожалению под рукой нет, проверить не могу

shty ★★★★★
()
Ответ на: комментарий от shty

При чём тут моя версия? Обработчик исключения не возвращает значения и, следовательно, не имеет отношения к РВО.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

При чём тут моя версия?

просто интересно

Обработчик исключения не возвращает значения и, следовательно, не имеет отношения к РВО.

читайте внимательно о чём речь шла

и да, для того чтобы использовать rvo не обязательно что-то возвращать :)

shty ★★★★★
()
Ответ на: комментарий от shty

> читайте внимательно о чём речь шла

О передаче агрумента в обработчик прерывания. Или мы читаем какие-то разные темы?

для того чтобы использовать rvo не обязательно что-то возвращать :)


Чего только не узнаешь про рво на лоре! А что же нужно сделать, чтобы его использовать? И вообще, это ничего, что RVO - это return-value optimization, т.е. оптимизация _возвращаемого_ значения?

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

И вообще, это ничего, что RVO - это return-value optimization, т.е. оптимизация _возвращаемого_ значения?

не-не-не, Вы ошибаетесь, здесь речь едёт не о «return value» а о rvalue, которое не lvalue

пруф

shty ★★★★★
()
Ответ на: комментарий от shty

> а о rvalue

О «rvalue» или о «rvalue reference»? Это разные вещи.

пруф


Rvalue reference не имеет отношения к теме - это новая конструкция языка, которую ТС не использовал.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

> а о rvalue

О «rvalue» или о «rvalue reference»? Это разные вещи.

читайте по ссылке, там всё разжёвано

Rvalue reference не имеет отношения к теме - это новая конструкция языка, которую ТС не использовал.

в своей структуре конечно не использовал, а там где catch(X)?

shty ★★★★★
()
Ответ на: комментарий от shty

читайте по ссылке, там всё разжёвано

По ссылке разжёвано, что вы подразумеваете тут на лоре? Я не смог найти ничего похожего. Вас не затруднит привести цитату?

а там где catch(X)?

И даже тут я по прежнему не вижу волшебных символов «&&». Давайте мы с вами поищем вместе. Итак, вот оглавление материала по ссылке:

Contents

    * Introduction
    * The rvalue reference
    * Move Semantics
    * Perfect Forwarding
    * References

В каком из этих разделов идёт речь о передаче параметера по значению в обработчик прерывания?

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.