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

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

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

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

31.05.2014, 15:36. Просмотров 1390. Ответов 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?
Посмотрите здесь:

C++ Почему у меня не работает нужно исправить
Нужно экспертное мнение! Что рациональнее!? почему так работают функции?! C++
C++ Почему компилятору нужно динамическое связывание?
C++ noexcept возвращает значение?
C++ Почему в scanf нужно указывать именно адреса переменных?
Noexcept - рекомендации по применению C++
Почему цикл while выполняет здесь больше итераций чем нужно? C++
Noexcept и throw() C++
Оператор noexcept и перегруженные методы класса C++
C++ Почему нужно использовать только нечетные числа в данной реализации программы Лабиринт?
C++ Почему нужно переопределять метод, для использования ?
C++ Ключевое слово noexcept

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12798 / 7258 / 809
Регистрация: 27.09.2012
Сообщений: 17,929
Записей в блоге: 2
Завершенные тесты: 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Эксперт С++
12798 / 7258 / 809
Регистрация: 27.09.2012
Сообщений: 17,929
Записей в блоге: 2
Завершенные тесты: 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Эксперт С++
12798 / 7258 / 809
Регистрация: 27.09.2012
Сообщений: 17,929
Записей в блоге: 2
Завершенные тесты: 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?
Ответ Создать тему
Опции темы

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