Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
Mochola
0 / 0 / 0
Регистрация: 19.04.2019
Сообщений: 11
Завершенные тесты: 1
1

Создание манипуляторов вывода

04.05.2019, 12:10. Просмотров 1588. Ответов 20
Метки нет (Все метки)

Нужно написать манипулятор вывода, который устанавливает флаги hex, showbase, uppercase. А так же еще один манипулятор который возвращает изначальные флаги. Написал следующее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
ostream &mysethex(ostream &stream)
{
    stream.unsetf(ios::dec);
    stream.setf(ios::hex | ios::showbase | ios::uppercase);
    return stream;  
}
 
ostream &result(ostream &st)
{
    st.unsetf(ios::hex | ios::showbase | ios::uppercase);
    st.setf(ios::dec);
    return st;
}
При компиляции бьет ошибку:

Ошибка LNK2005 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl mysethex(class std::basic_ostream<char,struct std::char_traits<char> > &)" (?mysethex@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV12@@Z) уже определен в func.obj

Подскажите пожалуйста в чем проблема?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2019, 12:10
Ответы с готовыми решениями:

Создание манипуляторов
Здравствуйте! Задание: создать манипулятор, который будет игнорировать при вводе некоторые...

Отличие форматирующих функций, флагов, манипуляторов
Изучал форматный ввод и когда уже начал думать, что понимаю его, столкнулся с тем, что мне не...

Использование потоковых манипуляторов в методах класса
Здравствуйте! Скажите, пожалуйста, почему не работают манипуляторы? #include &lt;iostream&gt;...

Значения флагов-манипуляторов управления вводом/выводом.
Почему отличаются значения флагов-манипуляторов управления вводом/выводом, которые нахожу в инете,...

Как с помощью манипуляторов (или флагов форматирования) найти количество знаков после запятой?
#include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; int main() { float g =...

20
zayats80888
1752 / 979 / 419
Регистрация: 07.02.2019
Сообщений: 2,654
04.05.2019, 12:29 2
Mochola, что я делаю не так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using namespace std;
 
ostream &mysethex(ostream &stream)
{
    stream.unsetf(ios::dec);
    stream.setf(ios::hex | ios::showbase | ios::uppercase);
    return stream;
}
 
ostream &result(ostream &st)
{
    st.unsetf(ios::hex | ios::showbase | ios::uppercase);
    st.setf(ios::dec);
    return st;
}
 
int main()
{
    mysethex(cout) << 5 << std::endl;
    result(cout) << 5 << std::endl;
}
0
Mochola
0 / 0 / 0
Регистрация: 19.04.2019
Сообщений: 11
Завершенные тесты: 1
04.05.2019, 12:36  [ТС] 3
zayats80888, похоже проблема в том что помимо манипуляторов в программе еще есть перегрузка операторов ">>" & "<<". Когда закоментил все кроме самих манипуляторов то заработало. каким образом они мешают друг другу?
0
zayats80888
1752 / 979 / 419
Регистрация: 07.02.2019
Сообщений: 2,654
04.05.2019, 12:38 4
Цитата Сообщение от Mochola Посмотреть сообщение
каким образом они мешают друг другу?
Не видя того, о чем вы говорите, трудно что либо сказать. Тут телепаты редкость.
0
04.05.2019, 12:38
Mochola
0 / 0 / 0
Регистрация: 19.04.2019
Сообщений: 11
Завершенные тесты: 1
04.05.2019, 12:40  [ТС] 5
Весь код:
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
51
52
53
54
55
#include <iostream>
#include <Windows.h>
#include <iomanip>
 
using namespace std;
 
class watch
{
    SYSTEMTIME time;
public:
    watch()
    {
        GetSystemTime(&time);
    }
 
    void gettime()
    {
        cout << "Текущее время: ";
        cout << time.wHour << ':' << time.wMinute << ':' << time.wSecond << endl;
    }
 
    friend ostream &operator <<(ostream &stream, watch ob);
};
 
class pwr {
    int base;
    int exponent;
    int result =1;
public:
    pwr(int b, int e)
    {
        base = b;
        exponent = e;
        for (; e; e--)result = result * base;
    }
 
    friend ostream &operator <<(ostream &stream, pwr ob);
    friend istream &operator >>(istream &stream, pwr &ob);
};
 
 
 
ostream &mysethex(ostream &stream)
{
    stream.unsetf(ios::dec);
    stream.setf(ios::hex | ios::showbase | ios::uppercase);
    return stream;  
}
 
ostream &result(ostream &st)
{
    st.unsetf(ios::hex | ios::showbase | ios::uppercase);
    st.setf(ios::dec);
    return st;
}
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
#include "header.h"
 
ostream &operator <<(ostream &stream, watch ob)
{
    stream << "Текущее время: ";
    stream << ob.time.wHour << ':' << ob.time.wMinute << ':' << ob.time.wSecond << endl;
    return stream;
}
 
ostream &operator <<(ostream &stream, pwr ob)
{
    stream << "base = " << ob.base << endl;
    stream << "exp = " << ob.exponent << endl;
    stream << "result = " << ob.result << endl;
    return stream;
}
 
istream &operator >>(istream &stream, pwr &ob)
{
    cout << "Введите значение base: ";
    stream >> ob.base;
    cout << "Введите значение exp: ";
    stream >> ob.exponent;
    return stream;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "header.h"
 
int main()
{
    setlocale(LC_ALL, "ru");
 
    watch a;
    cout << a;
 
    pwr b(5, 6);
    cin >> b;
    cout << b;
    
    mysethex(cout) << 100 << endl;
    result(cout) << 100 << endl;
    return 0;
}
0
zayats80888
1752 / 979 / 419
Регистрация: 07.02.2019
Сообщений: 2,654
04.05.2019, 12:54 6
Лучший ответ Сообщение было отмечено Mochola как решение

Решение

Mochola, перенесите определение манипуляторов в header.cpp, а в header.h оставьте только объявление

Добавлено через 1 минуту
или определите их как inline в хидере
1
Mochola
0 / 0 / 0
Регистрация: 19.04.2019
Сообщений: 11
Завершенные тесты: 1
04.05.2019, 12:57  [ТС] 7
zayats80888, Спасибо большое! перенос определения из хедера исправил ошибку
0
hoggy
Эксперт С++
7402 / 3329 / 688
Регистрация: 15.11.2014
Сообщений: 7,615
Завершенные тесты: 1
04.05.2019, 20:14 8
за такой код:
Цитата Сообщение от Mochola Посмотреть сообщение
friend ostream &operator <<(ostream &stream, pwr ob);
ты, главное, на собеседовании такой код работодателю не показывай.
потому что:

1.
заusing namespace std; в хэдере расстрел на месте сразу следует ответ: "мы вам перезвоним."

2.
ostream &stream
амперсанд - часть типа, а не имени.
поэтому, его нужно ставить возле типа, а не имени.

а вот здесь, нафига ты его вообще от типа оторвал? ostream &operator
у тебя что - часть оператора что ли?

3.
нафига ты передаёшь аргумент по значению? pwr ob

считаешь, что это нормально:
когда программа начинает жрать память и тормозить на ровном месте?

4.
твоя функция кидает исключения?
судя по коду - не кидает.
а раз не кидает, то это должно быть отражено в объявлении функции
с помощью спецификатора noexcept

правильно писать:
C++
1
friend std::ostream& operator <<(ostream& stream, const pwr& ob) noexcept;
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5765 / 2767 / 757
Регистрация: 18.10.2014
Сообщений: 4,971
04.05.2019, 21:20 9
Цитата Сообщение от hoggy Посмотреть сообщение
2.
ostream &stream
амперсанд - часть типа, а не имени.
поэтому, его нужно ставить возле типа, а не имени.

а вот здесь, нафига ты его вообще от типа оторвал? ostream &operator
у тебя что - часть оператора что ли?
Объявление в языках С и С++ имеет следующий общий синтаксис

Код
decl-specifier-seq   declarator, declarator, declarator, ..., declarator;
Символ & в объявлении - часть индивидуального declarator, а не часть decl-specifier-seq. То есть в ostream & stream символ & грамматически относится именно к объявляемому имени stream, а не к имени типа ostream. Поэтому правильно именно ostream &stream.

Пытаться насильно "переиначить" натуральные грамматические связи в С или С++ под свои предпочтения путем "креативного" форматирования не приведет ни к чему, кроме трудночитаемого кода.

Аргумент "часть типа, а не имени" бессмыслен: эта логика в принципе не применима, ибо синтаксис объявления в С и С++ заведомо не позволяет держать все части типа вместе (см. массивы и функции) и заниматься крохоборством с & или * бесполезно.

Цитата Сообщение от hoggy Посмотреть сообщение
4.
твоя функция кидает исключения?
судя по коду - не кидает.
Это как это? Она вызывает другие функции, которые запросто могут кидать исключения. Именно "судя по коду".

Цитата Сообщение от hoggy Посмотреть сообщение
а раз не кидает, то это должно быть отражено в объявлении функции
с помощью спецификатора noexcept
Нет, ни в коем случае. Не трогайте noexcept вообще, кроме тех случаев, когда это действительно критически необходимо. В остальных случаях получится больше вреда, чем пользы. Никакого noexcept здесь быть не должно ни в коем случае.
4
hoggy
Эксперт С++
7402 / 3329 / 688
Регистрация: 15.11.2014
Сообщений: 7,615
Завершенные тесты: 1
04.05.2019, 21:31 10
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Аргумент "часть типа, а не имени" бессмыслен
расскажи это шаблонам с++

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это как это? Она вызывает другие функции, которые запросто могут кидать исключения. Именно "судя по коду".
какие другие?
если у тебя ostream<< начал кидать исключения - уволить тебя тогда нужно.
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5765 / 2767 / 757
Регистрация: 18.10.2014
Сообщений: 4,971
04.05.2019, 21:44 11
Цитата Сообщение от hoggy Посмотреть сообщение
расскажи это шаблонам с++
Это что за чушь? У шаблонов в С++ какая-то новая грамматика??? Я, видать, сильно отстал от жизни... )))

Цитата Сообщение от hoggy Посмотреть сообщение
какие другие?
если у тебя ostream<< начал кидать исключения - уволить тебя тогда нужно.
!!! Тут дикая адская бредятина полезла просто бурным потоком.

Стандартные операторы форматированного вывода << испокон веков кидают исключения. Уж что-что, а операции ввода-вывода - хрестоматийные примеры операций, бросающих исключения.

http://eel.is/c++draft/output.streams#ostream.formatted.reqmts

Each formatted output function begins execution by constructing an object of class sentry. If this object returns true when converted to a value of type bool, the function endeavors to generate the requested output. If the generation fails, then the formatted output function does setstate(ios_*base::failbit), which might throw an exception. If an exception is thrown during output, then ios::badbit is turned on in *this's error state. If (exceptions()&badbit) != 0 then the exception is rethrown. Whether or not an exception is thrown, the sentry object is destroyed before leaving the formatted output function. If no exception is thrown, the result of the formatted output function is *this.
0
hoggy
Эксперт С++
7402 / 3329 / 688
Регистрация: 15.11.2014
Сообщений: 7,615
Завершенные тесты: 1
04.05.2019, 22:20 12
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это что за чушь?
это ты сейчас что за тупорылые вопросы задаешь словно в первый раз замужем?

"ссылка" - свойство типа
не имени.

будешь спорить?

C++
1
int& ref = value;
почему ref - ссылочная переменная?
потому что она имеет тип ссылки int&

будешь спорить?

по поводу шаблонов:
что именно ты передаешь в шаблон:
C++
1
std::cout << std::is_reference<type>::value << '\n';
и в каких случаях шаблон вернет значение true ?
http://www.cplusplus.com/reference/type_traits/is_reference/

итого: "ссылка" - свойство типа.
внезапно что ли?


Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Стандартные операторы форматированного вывода << испокон веков кидают исключения.
ты свою собственную ссылочку внимательно читал?

стримы действительно могут кидать исключения если их специальным образом настроить.
http://www.cplusplus.com/reference/ios/ios/exceptions/

1.
где ты в коде тс увидел такую настройку?
а раз её нет, значит стрим не бросит исключение.

2.
на практике так вообще никто не делает.

если у тебя делают, тогда:
Цитата Сообщение от hoggy Посмотреть сообщение
уволить тебя тогда нужно.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
испокон веков
стримы не кидают никаких эксепшенов,
просто потому что, что никому там нафиг не нужны.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5765 / 2767 / 757
Регистрация: 18.10.2014
Сообщений: 4,971
05.05.2019, 00:36 13
Цитата Сообщение от hoggy Посмотреть сообщение
это ты сейчас что за тупорылые вопросы задаешь словно в первый раз замужем?
Следите за свои языком.

Цитата Сообщение от hoggy Посмотреть сообщение
"ссылка" - свойство типа
...
итого: "ссылка" - свойство типа.
К чему здесь эта ^^^^ пространная шумовая завеса? С тем, что ссылка - свойство типа, тут никто не спорил.

Это тем не менее никоим образом не означает, что в объявлении символ & следует лепить к decl-specifier-seq. Нет, не следует, по причинам, которые я ясно объяснил выше.

Объявление

C++
1
int &a, b, *const c;
объявляет три идентификатора совершенно разных типов и только один из них - a - имеет ссылочный тип. Именно поэтому в языках С и С++ имеет смысл выравнивать & и * вправо и присоединять его к объявляемому имени, как ясно диктуется синтаксисом и семантикой объявления.

Если вам нравится делать по-другому - пожалуйста, никто вам не запретит. Даже в примерах в Стандарте языка доминирует именно предложенный вами вариант. Но если вы будете навязывать вашу манеру другим в качестве "единственно правильной", то лишь вот так вот опростоволоситесь.

Цитата Сообщение от hoggy Посмотреть сообщение
стримы действительно могут кидать исключения если их специальным образом настроить.
Именно так. И когда вы пишете свои операторы вывода на основе стандартных операторов вывода, вы просто естественным образом наследуете это поведение. Ничего тут изобретать и переделывать не надо.

Цитата Сообщение от hoggy Посмотреть сообщение
где ты в коде тс увидел такую настройку?
а раз её нет, значит стрим не бросит исключение.
Нет, конечно, не значит! Наоборот, это значит, что ничего нового выдумывать не нужно: наши операторы просто ведут себя точно так же, как стандартные операторы. Как я сказал выше, ничего тут изобретать и переделывать не надо. Видите как просто и логично?

Цитата Сообщение от hoggy Посмотреть сообщение
на практике так вообще никто не делает. просто потому что, что никому там нафиг не нужны.
Своими "никто не делает" и "никому там нафиг не нужны" вы, очевидно, пытаетесь рассмешить собравшихся ))) Я ценю ваши усилия, но подобное мы тут видели тысячи раз и уже отсмеялись.

Вместе подобных выступлений, зарубите себе на носу простые и логичные рекомендации:

1. Если ваша функция вызывает другие функции, которые не являются noexcept, то и ваша функция не должна быть noexcept. (Если вы не предпринимаете сознательных усилий для ловли и подавления исключений, по какой-то очень хорошей причине.)

2. Даже если ваша функция не должна бросать исключения, но компилятору это не очевидно, то стоит несколько раз очень хорошо подумать о том, стоит ли на такую функцию лепить noexcept. Объявление функции как noexcept может приводить к неприятным последствиям с точки зрения размера и эффективности кода из-за того, что компилятор будет вынужден генерировать дополнительный код для обработки нештатной ситуации "стоит noexcept, но исключение таки прилетело".
0
hoggy
Эксперт С++
7402 / 3329 / 688
Регистрация: 15.11.2014
Сообщений: 7,615
Завершенные тесты: 1
05.05.2019, 05:50 14
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Следите за свои языком.
за собой следи.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
К чему здесь эта ^^^^ пространная шумовая завеса? С тем, что ссылка - свойство типа, тут никто не спорил.
никто не спорил с тем,
что на плюсах можно писать через жопу.
это не значит, что это - нормально.

вот это говно:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
int &a, b, *const c;
никогда не пройдет кодревью ни в одной приличной конторе.

если амперсанд относится к типу,
то и писать его нужно тоже возле типа.

это что такое? int& это - ссылка.
а это что такое? &name это - взятие адреса.
а это что такое? int &name это - говнокод.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Видите как просто и логично?
вижу, как ты предлагаешь писать говнокод,
который не несет ответственность за эксепшены.

нормальные люди могут сказать точно:
может бросить их функция исключение,
или нет.

в коде тс std::cout не может бросить исключение.
не догадался ещё почему?

я тебе сообщением выше предлагал догадаться.
но ты как то проигнорировал.

может теперь не проигнорируешь?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Своими "никто не делает" и "никому там нафиг не нужны" вы, очевидно, пытаетесь рассмешить собравшихся
не знаю, что ты здесь смешного увидел.
может ты из этих: пальчик покажешь, они ржут.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
1. Если ваша функция вызывает другие функции, которые не являются noexcept, то и ваша функция не должна быть noexcept.
эта тупорылая рекомендация не имеет ничего общего ни с логикой,
ни со здравым смыслом вообще.

мои функции могут использовать WINAPI, например.
которые, как известно, не кидают исключений.

но ты, по своей тупорылой логике, конечно,
все равно не будешь ставить noexcet

а теперь правильный ответ:
однажды выставленный в апи-функции спецификатор noexcept
уже нельзя будет просто так взять и убрать.
потому что легаси.
внешний код уже может заложиться на контракт.

noexcept ставят не туда,
где функция не кидает исключений "здесь-и-сейчас"
а туда, где она не кинет исключение вовсе "ни сейчас, ни потом".
потому что здравый смысл.
и это - гарантия от разработчика.

классика жанра:
Цитата Сообщение от Mochola Посмотреть сообщение
friend ostream &operator <<(ostream &stream, const some& ob);
может бросить исключение только у клинического идиота.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Объявление функции как noexcept может приводить к неприятным последствиям с точки зрения размера и эффективности кода из-за того, что компилятор будет вынужден генерировать дополнительный код для обработки нештатной ситуации "стоит noexcept, но исключение таки прилетело".
ты вообще в курсе зачем завезли noexcept?

что бы компилятор смог сгенерировать более эффективный код за счет того,
что не нужно генерить обвяз для поддержки исключений.

почитай Скот Майерса.
или хабр.
https://habr.com/ru/post/164221/
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5765 / 2767 / 757
Регистрация: 18.10.2014
Сообщений: 4,971
05.05.2019, 07:12 15
Цитата Сообщение от hoggy Посмотреть сообщение
вот это говно:никогда не пройдет кодревью ни в одной приличной конторе...если амперсанд относится к типу,
то и писать его нужно тоже возле типа...это - говнокод....говнокод, который не несет ответственность за эксепшены....нормальные люди могут сказать точно: может бросить их функция исключение или нет....пальчик покажешь, они ржут может бросить исключение только у клинического идиота...почитай Скот Майерса или хабр.
Н-да... Полный "илихабр". Я думаю, что нет смысла больше тратить время на разбор этого потока воплей. Я полностью закрыл все вопросы своими ответами выше.
1
hoggy
Эксперт С++
7402 / 3329 / 688
Регистрация: 15.11.2014
Сообщений: 7,615
Завершенные тесты: 1
05.05.2019, 15:28 16
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Н-да... Полный "илихабр". Я думаю, что нет смысла больше тратить время на разбор этого потока воплей.
где ты вопли то услышал, клоун?

вот я тебе предложил посмотреть ещё раз код тс, и ответить на вопрос:
почему std::cout в его коде никогда не бросит исключение?

ты не смог ответить, и решил отмазаться по принципу:
"нет смысла тратить время"?

ты запутался?
несешь какой то бред с умной рожей,
и теперь просто загнан в угол?
не знаешь, как ответить?

знаешь в чем твоя проблема?
ты реально не понимаешь,
зачем вообще завезли noexcet в язык

по какой то идиотской причудливой логике у тебя получается,
что для этого:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Объявление функции как noexcept может приводить к неприятным последствиям с точки зрения размера и эффективности кода
вот специально ввели слово,
что бы код ухудшать, вестимо.

ты вообще долго думал, прежде чем такой перл выдать?

и да, конечно, статья на хабре, которая циферки приводит, и наглядно иллюстрирует,
что noexcept позволило улучшить код - это "полный илихабр"

фишка в том, дорогой мой неадекватный друх.
что своего авторитетного мнения ты сейчас сказать не сможешь.
ты в логическом тупике.

а когда форумный тролль в тупике,
то он начинает отбрехиваться по типу:
"илихабр", "нет смысла тратить..."


Цитата Сообщение от TheCalligrapher Посмотреть сообщение
компилятор будет вынужден генерировать дополнительный код для обработки нештатной ситуации "стоит noexcept, но исключение таки прилетело".
тебе деструкторы жить не мешают?
они ведь, о боже! все неявно помечены как noexcet.


покажи мне,
как ты напишешь деструктор простого класса для простой задачи.
вот нужно написать в конструкторе "constructor", а в деструкторе: "destructor"

собственно вся задача.

все нормальные люди решат задачку как то так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
struct sample
{
    sample() { std::cout << "constructor\n"; }
   ~sample() { std::cout << "destructor\n" ; }
};
 
int main()
{
    sample obj;
}
мне вот интересно, как ты сможешь решить эту задачку?

по твоей альтернативно долбанутой логике должно быть так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
struct sample
{
    sample() { std::cout << "constructor\n"; }
 
    // и какой только идиот придумал что деструкторы не кидают исключения?
 
   ~sample() noexcept(true) { std::cout << "destructor\n" ; }
};
 
int main()
{
    sample obj;
}

или так:

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
#include <iostream>
 
struct sample
{
    sample() { std::cout << "constructor\n"; }
   ~sample() { 
       
       try 
       {
           std::cout << "destructor\n" ;
       }
       catch(...)
       {
           // и что я теперь здесь буду делать?
           // а!!! сделаю вид, что ничего не произошло
       }
       
   }
};
 
int main()
{
    sample obj;
}
а правда ведь на самом деле очень простая.
простая и понятная.

noexcept завезли в язык,
что бы увеличить эффективность кода зная о том,
что функция никогда не бросит исключение.

насколько хорошо или плохо это получается у компиляторов,
а главное, как именно им удается оптимизировать - вопрос отдельный.

хуже код точно не станет.
(и циферки на этих всяких разных "илихабрах..." это наглядно иллюстрируют)

я не ожидал, что такой пародистый персонаж, как ты, TheCalligrapher,
сморозит такую откровенно нелогичную бредятину.


по поводу применимости noexcept - программист, который пишет функцию,
сам решает, будет она у него кидать исключения или нет
.
руководствуется он при этом здравым смыслом.

он смотрит на детали реализации своей функции.
какие функции используются?
могут ли они кидать исключения?
при каких обстоятельствах?
является ли это одним из правильных (ожидаемых) сценариев?
и тд.

ну так вот, если здравый смысл подсказывает,
что исключение вылететь не должно,
тогда он должен поставить noexcept

нет, он, конечно, не обязан.
здесь как с квалификатором const

в обоих случаях: неграмотное использование - признак дилетанта.
0
Croessmah
++Ͻ
15869 / 8997 / 1728
Регистрация: 27.09.2012
Сообщений: 22,115
Записей в блоге: 2
Завершенные тесты: 2
13.05.2019, 13:10 17
del
0
Undisputed
625 / 243 / 55
Регистрация: 10.06.2014
Сообщений: 2,046
Завершенные тесты: 3
13.05.2019, 15:07 18
Цитата Сообщение от hoggy Посмотреть сообщение
а раз не кидает, то это должно быть отражено в объявлении функции
с помощью спецификатора noexcept
если говорить о производительности, то какие проблемы могут быть если не написать noexcept?
обычно в asm листингах что с ним что без него одно и то же если в коде нет бросков исключения.
из моей скромной практики на С++ функции/методы чаще не бросают исключение
поэтому везде дописывать noexcept как то не очень удобно
к тому же со временем этого noexcept становится так много
что создается впечатление что это часть синтаксиса объявления функции/метода.

помоему лучше использовать noexcept там где он реально нужен и по необходимости
например в конструкторе перемещения, тип которого используется скажем как элементы std::vector
что бы при реаллокации сработало перемещение а не копирование
0
Croessmah
++Ͻ
15869 / 8997 / 1728
Регистрация: 27.09.2012
Сообщений: 22,115
Записей в блоге: 2
Завершенные тесты: 2
13.05.2019, 18:10 19
Цитата Сообщение от Undisputed Посмотреть сообщение
обычно в asm листингах
Можно поэкспериментировать.
2
Undisputed
625 / 243 / 55
Регистрация: 10.06.2014
Сообщений: 2,046
Завершенные тесты: 3
13.05.2019, 19:49 20
Croessmah,
И то верно
https://godbolt.org/z/6GS2ZM
0
13.05.2019, 19:49
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2019, 19:49

Отключение манипуляторов Мышь в начале загрузки Windows 7
Сегодня на двух компах в одной сети большой организации с выходом в интернет при загрузке Win7...

Создание универсальной функции вывода
У меня есть две функции: одна выводит изображение на экран, а вторая его распечатывает....

Создание колон для вывода
Вобщем пишу код в функции обработки сообщений окна при обработке сообщения WM_CREATE:...


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

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

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