Описание тега noexcept

Ключевое слово C++, используемое для спецификаций исключений и для запроса, может ли выражение вызывать исключения.
1 ответ

Использовать "noexcept" в std::function?

Этот код компилируется и запускается, бросая int: #include <functional> void r( std::function<void() noexcept> f ) { f(); } void foo() { throw 1; } int main() { r(foo); } Однако я хотел бы, чтобы компилятор отклонил строку r(foo); так ка…
24 июл '15 в 05:35
1 ответ

g++-4.8.1 считает, что явно объявленный деструктор без спецификации исключения всегда noexcept(true)

Рассмотрим следующую программу: #include <type_traits> struct Thrower { ~Thrower() noexcept(false) { throw 1; } }; struct Implicit { Thrower t; }; static_assert(!std::is_nothrow_destructible<Implicit>::value, "Implicit"); struct Explicit…
18 июн '13 в 19:35
1 ответ

Почему деструкторы интеллектуальных указателей типа std не наследуют статус noexcept dtor указанного объекта

В C++11 я понимаю, что по умолчанию деструкторы неявно noexcept(true), Кроме этого: Если у меня есть класс C который имеет деструктор, явно помеченный noexcept(false) (предположительно потому, что он выбрасывает по какой-то странной причине, и я зна…
22 окт '13 в 21:27
1 ответ

Передача нулевого указателя на размещение нового

Размещение по умолчанию new Оператор объявлен в 18.6 [support.dynamic] ¶1 с ненулевой спецификацией исключения: void* operator new (std::size_t size, void* ptr) noexcept; Эта функция не делает ничего, кроме return ptr; поэтому разумно noexceptоднако…
10 июл '13 в 12:50
0 ответов

Прибыль от noexcept с минимальными усилиями

Я понимаю, что контейнеры можно оптимизировать для типов, не имеющих кроме конструктора перемещения / присваивания / обмена. Но есть ли практические причины (помимо документации) для определения других операций как noexcept? В частности, мне интерес…
16 июл '15 в 16:39
5 ответов

Как спецификатор исключения в операторе присваивания перемещения может влиять на конструктор перемещения?

Я тестирую с GCC 5.2 и clang 3.6, оба в режиме C++14, и они дают одинаковый результат. Для следующего кода #include <iostream> #include <type_traits> struct S { // S& operator= (S&&) noexcept { return *this; } }; int main() {…
10 окт '15 в 18:33
3 ответа

Разница между C++03 throw() спецификатором C++11 не исключая

Есть ли другая разница между throw() а также noexcept кроме проверки времени выполнения и времени компиляции соответственно? Статья Википедии C++11 предполагает, что спецификаторы бросков C++03 устарели.Почему так noexcept достаточно ли, чтобы покры…
11 окт '12 в 06:09
1 ответ

Разрешено ли "this" внутри спецификации noexcept?

У меня есть код, который требует от меня использовать *this, но я хочу, чтобы он был не дружелюбным struct foo; // Would actually be something with conditional noexcept void do_something(foo&); struct foo { void fn() noexcept(noexcept(::do_somet…
24 окт '18 в 16:55
2 ответа

Почему std::vector использует конструктор перемещения, хотя и объявлен как noexcept(false)

Везде, где я читаю в Интернете, настоятельно рекомендуется, чтобы, если я хочу, чтобы мой класс хорошо работал с std::vector (т.е. семантика перемещения из моего класса использовалась std::vector) Мне следует переместить конструктор delcare как noex…
06 окт '14 в 20:11
1 ответ

Рекурсивная спецификация noexcept

Тестирование с g++ 4.9 и clang 3.4, почему этот код не компилируется: namespace { template<typename T> constexpr auto f(T && t) noexcept { return true; } template<typename T, typename... Ts> constexpr auto f(T && t, Ts &a…
21 май '14 в 02:13
0 ответов

noexcept: различное поведение на clang++ и g ++

#include <iostream> using namespace std; class A { public: void g() noexcept {} void f() noexcept( noexcept( g() )) {}; }; A a; int main() { cout<<noexcept(a.f())<<endl; return 0; } Когда я пытаюсь скомпилировать эту программу с по…
07 июн '15 в 07:28
3 ответа

Почему приведенный ниже код не компилируется с gcc, но прекрасно компилируется с помощью clang

Ниже код хорошо компилируется с помощью clang, но не с помощью gcc. Любое объяснение - это ошибка в gcc? Это просто класс, который содержит вектор unique_ptr и std::function в качестве члена, и когда я создаю вектор этого класса, я не могу сказать з…
2 ответа

Функция с возвращаемым значением & noexcept

Этот вопрос двойственный: "Конструктор с параметром по значению & noexcept". Этот вопрос показал, что управление временем жизни аргумента функции по значению обрабатывается вызывающей функцией; поэтому вызывающая сторона обрабатывает любые возникающ…
13 фев '12 в 23:14
3 ответа

Почему операторы векторного доступа не указаны как noexcept?

Зачем std::vector"s operator[], front а также back функции-члены не указаны как noexcept?
11 дек '13 в 10:56
2 ответа

Почему разрешено генерировать исключение внутри функции с тегами noexcept?

Мне трудно понять это. double compute(double x, double y) noexcept { if (y == 0) throw std::domain_error("y is zero"); return x / y; } это хорошо компилируется в clang (я не проверял gcc), но мне кажется, что это чепуха. Зачем компилятору разрешать …
04 апр '16 в 01:10
3 ответа

Скопировать исключение возвращаемых значений и noexcept

У меня есть такой шаблон функции: template <typename T> constexpr auto myfunc() noexcept { return T{}; } Этот шаблон функции гарантированно не будет исключением из-за исключения копирования? Если исключение выдается внутри конструктора, происх…
21 апр '18 в 15:27
3 ответа

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

Рассмотрим следующий класс с конструктором перемещения и оператором присваивания перемещения: class my_class { protected: double *my_data; uint64_t my_data_length; } my_class(my_class&& other) noexcept : my_data_length{other.my_data_length},…
26 авг '15 в 10:37
2 ответа

Может ли неинициализированный конструктор std::option или boost::option генерировать?

Может ли быть объявлен любой из следующих методов шаблона noexcept? template <typename T> std::optional<T> foo(const T& value) // noexcept? { try { // code possibly returning a T or a std::nullopt } catch(...) { return std::nullopt; …
14 янв '16 в 20:55
1 ответ

Нет, кроме требования вектора не соблюдены

Технически, кроме указанного move c'tor, требуется, чтобы вектор использовал move вместо copy c'tor. Я обнаружил, что это не относится к GCC 7. std::vector<A> v; v.push_back(A("555")); //triggers move c'tor Вышеописанное работает до тех пор, п…
02 мар '18 в 16:31
2 ответа

C++11: возвращает ли объект по значению никогда не генерирует исключения, когда определяется ctor перемещения?

В C++11 и более поздних стандартах гарантируется, что ctor копии (возможно, выбрасывающий исключение) не вызывается при возврате объекта класса по значению из функции - при условии, что ctor перемещения определен для этого класса? Фон: Предположим, …
12 окт '17 в 09:25