Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

31.05.2014, 15:36. Просмотров 1925. Ответов 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) не имеет конструктора по умолчанию)

Помогите разобраться, плз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2014, 15:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему нужно noexcept? (C++):

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

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

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

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 для всех своих методов/операторов/конструкторов. Однако, он...

5
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
31.05.2014, 17:00 #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);
3
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
31.05.2014, 17:35  [ТС] #3
Croessmah, я напутал в первом вопросе: в c++98 не компилируется без throw()-спецификатора. Ну да ладно, благодаря разъяснениям все-равно разобрался.
Ну и в остальных тоже все стало ясно.

Спасибо!

Еще вопрос появился. Где находятся определения функций заголовочных файлов? Где найти ту же std::exception::what() ?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
31.05.2014, 17:37 #4
C++
1
#include <exception>
http://www.cplusplus.com/reference/exception/exception/
0
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
31.05.2014, 17:42  [ТС] #5
Croessmah, так а где их реализация в системе? Я имею ввиду где в системе находятся файлы с определениями exception::what(), string::c_str() и т.д. чтобы их почитать?
Я вот просматриваю файл exception и там только обпределения самих классов без методов.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
31.05.2014, 18:17 #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
1
31.05.2014, 18:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2014, 18:17
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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