Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
#1

Почему нужно noexcept? - C++

31.05.2014, 15:36. Просмотров 1574. Ответов 5
Метки нет (Все метки)

Здравствуйте.
Сразу код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class logic_error_ext : public std::exception
{
private:
    std::string mesg;
    bool type; //if 0 - error in hmean(), 1 - in gmean()
public:
 
    explicit logic_error_ext(std::string m, bool t) : mesg(m), type(t)
    {
    }
 
    const char* what() const noexcept
    {
        return mesg.c_str();
    }
 
    bool Type() const
    {
        return type;
    }
};
Три вопроса?
1 - Почему без noexcept в c++98 не компилируется?
Кликните здесь для просмотра всего текста
main.cpp:19:17: error: exception specification of overriding function is more lax than base version
const char* what() const
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/exception:68:25: note: overridden virtual function is here
virtual const char* what() const _GLIBCXX_USE_NOEXCEPT;
^
main.cpp:8:7: error: exception specification of overriding function is more lax than base version
class logic_error_ext : public std::exception
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/exception:64:13: note: overridden virtual function is here
virtual ~exception() _GLIBCXX_USE_NOEXCEPT;
^
2 errors generated.

2 - Как следствие первого: почему в c++11 скомпилировать этот кусочек кода можно только с noexcept ?
3 - Почему не могу наследовать std::logic_error (компилятор говорит, мол, он(logic_error) не имеет конструктора по умолчанию)

Помогите разобраться, плз.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2014, 15:36     Почему нужно noexcept?
Посмотрите здесь:

Noexcept и throw() - C++
здравствуйте, подскажите, в каких случаях нужно использовать noexcept за исключением деструкторов и swap?

Noexcept - рекомендации по применению - C++
У меня вопрос - есть ли какие то правила по применению этого ключевого слова на практике? Когда стоит пользоваться, а когда нет? Из всего...

Ключевое слово noexcept - C++
Прочитал про noexcept и понял, что его нужно использовать для тех методов, которые не бросают исключение, что бы компилятор не генерировал...

noexcept возвращает значение? - C++
Прототип std::swap выглядит так: template <class T, size_t N> void swap(T (&a), T (&b)) noexcept (noexcept(swap(*a,*b))); Получается,...

Оператор noexcept и перегруженные методы класса - C++
Всем привет Как проверить с помощью noexcept, кидает ли исключение нужный мне перегруженный метод? #include <iostream> #include...

Спецификатор noexcept для класса "исключение" - C++
Доброго все дня! Стандартный класс std::exception имеет спецификатор noexcept для всех своих методов/операторов/конструкторов. Однако, он...

Почему компилятору нужно динамическое связывание? - C++
Допустим A *ptr = &B; ptr->addvalue; , при компиляции не подставится адрес функции вместо имени, потому что ещё не создана таблица...

Почему у меня не работает нужно исправить - C++
#include <iostream.h> #include <stdio.h> #include <string.h> #include <math.h>...

Почему нужно переопределять метод, для использования ? - C++
Всем привет есть такой код : class A { private: int var; public: A() { var = 0 } int getVar() { ...

Почему в scanf нужно указывать именно адреса переменных? - C++
Почему в функции scanf нужно указывать именно адреса переменных? Почему не работает, когда указываем переменную? Что хранит в себе...

Почему цикл while выполняет здесь больше итераций чем нужно? - C++
Не понимаю от чего здесь цикл выполняется 21 раз вместо 10. Притом если вместо i < 10 написать i <= 10 цикл выполняется 23 раза... ...

Нужно экспертное мнение! Что рациональнее!? почему так работают функции?! - C++
Привет всем!:) Возникли небольшие непонятки с функциями которые вычисляют интеграл по формуле симпсона. Дело в том что ф-ция integ_2 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
31.05.2014, 17:00     Почему нужно noexcept? #2
Цитата Сообщение от andrejap Посмотреть сообщение
Почему без noexcept в c++98 не компилируется?
Потому что прототип такой:
C++
1
virtual const char* what() const throw();
Цитата Сообщение от andrejap Посмотреть сообщение
2 - Как следствие первого: почему в c++11 скомпилировать этот кусочек кода можно только с noexcept ?
потому что прототип такой:
C++
1
virtual const char* what() const noexcept;
Цитата Сообщение от andrejap Посмотреть сообщение
3 - Почему не могу наследовать std::logic_error (компилятор говорит, мол, он(logic_error) не имеет конструктора по умолчанию)
Ну так правильно говорит. Зато есть конструктор:
C++
1
explicit logic_error (const string& what_arg);
и в C++11 добавился:
C++
1
explicit logic_error (const char* what_arg);
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
31.05.2014, 17:35  [ТС]     Почему нужно noexcept? #3
Croessmah, я напутал в первом вопросе: в c++98 не компилируется без throw()-спецификатора. Ну да ладно, благодаря разъяснениям все-равно разобрался.
Ну и в остальных тоже все стало ясно.

Спасибо!

Еще вопрос появился. Где находятся определения функций заголовочных файлов? Где найти ту же std::exception::what() ?
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
31.05.2014, 17:37     Почему нужно noexcept? #4
C++
1
#include <exception>
http://www.cplusplus.com/reference/exception/exception/
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
31.05.2014, 17:42  [ТС]     Почему нужно noexcept? #5
Croessmah, так а где их реализация в системе? Я имею ввиду где в системе находятся файлы с определениями exception::what(), string::c_str() и т.д. чтобы их почитать?
Я вот просматриваю файл exception и там только обпределения самих классов без методов.
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
31.05.2014, 18:17     Почему нужно noexcept? #6
Цитата Сообщение от andrejap Посмотреть сообщение
так а где их реализация в системе?
В сорцах stdlibc++.
Вот мой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// -*- C++ -*- std::exception implementation.
// Copyright (C) 1994-2013 Free Software Foundation, Inc.
//
// This file is part of GCC.
//
// GCC is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3, or (at your option)
// any later version.
//
// GCC is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.
 
// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.
 
#include "typeinfo"
#include "exception"
#include <cxxabi.h>
 
std::exception::~exception() _GLIBCXX_USE_NOEXCEPT { }
 
std::bad_exception::~bad_exception() _GLIBCXX_USE_NOEXCEPT { }
 
abi::__forced_unwind::~__forced_unwind() throw() { }
 
abi::__foreign_exception::~__foreign_exception() throw() { }
 
const char* 
std::exception::what() const _GLIBCXX_USE_NOEXCEPT
{
  // NB: Another elegant option would be returning typeid(*this).name()
  // and not overriding what() in bad_exception, bad_alloc, etc.  In
  // that case, however, mangled names would be returned, PR 14493.
  return "std::exception";
}
 
const char* 
std::bad_exception::what() const _GLIBCXX_USE_NOEXCEPT
{
  return "std::bad_exception";
}
Цитата Сообщение от andrejap Посмотреть сообщение
string::c_str()
Это шаблон, так что отталкивайтесь от basic_string
Yandex
Объявления
31.05.2014, 18:17     Почему нужно noexcept?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru