примеры noexcept(expr)
От: Ruzzz  
Дата: 25.03.17 15:09
Оценка: 1 (1)
Покажите интересные нетривиальные примеры expr, которые можно использовать на практике.
noexcept
Re: примеры noexcept(expr)
От: Шахтер Интернет  
Дата: 25.03.17 23:17
Оценка:
Здравствуйте, Ruzzz, Вы писали:

R>Покажите интересные нетривиальные примеры expr, которые можно использовать на практике.


Ну, например

template <class I,class T>
struct IndexPair : CmpComparable<IndexPair<I,T> >
 {
  I index;
  T object;

  // constuctors

  IndexPair() noexcept( Meta::HasNothrowDefaultCtor<I> && Meta::HasNothrowDefaultCtor<T> ) : index(),object() {}

  IndexPair(I index_,const T &object_) : index(index_),object(object_) {}

  // methods

  .... 
 };
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[2]: примеры noexcept(expr)
От: Ruzzz  
Дата: 26.03.17 08:57
Оценка:
Я как раз о коде конструкций типа Meta::HasNothrowDefaultCtor и спрашиваю.
Re[3]: примеры noexcept(expr)
От: Шахтер Интернет  
Дата: 26.03.17 15:11
Оценка:
Здравствуйте, Ruzzz, Вы писали:

R>Я как раз о коде конструкций типа Meta::HasNothrowDefaultCtor и спрашиваю.


По-моему, ты всё-таки спрашивал о другом.

А что касается HasNothrowDefaultCtor то это очень простая штука.

template <class T>
const bool HasNothrowDefaultCtor = std::is_nothrow_default_constructible<T>::value ;
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: примеры noexcept(expr)
От: Ruzzz  
Дата: 26.03.17 15:54
Оценка:
R>Покажите интересные нетривиальные примеры expr, которые можно использовать на практике.

Вот например, есть шаблонный метод:
template <typename T>
void foo(const T &a1, const T &a2) noexcept(expr)
{
    ...
    if ((a1 == a2) || (a1 > a2))
    ...
}

После анализа, я делаю вывод что если и могут быть исключения, то только внутри указанной строки кода, причем T может быть также и тривиальным типом. Как это должно быть отражено в noexcept(expr)?
Re[4]: примеры noexcept(expr)
От: Ruzzz  
Дата: 26.03.17 15:55
Оценка:
Спасибо за пример.
Я просто о том что конструкцию типа Meta::HasNothrowDefaultCtor<I> я не смогу использовать на практике, ну мало ли что там внутри. Хочется конкретики.
Re[2]: примеры noexcept(expr)
От: Constructor  
Дата: 26.03.17 16:28
Оценка: 46 (3)
Здравствуйте, Ruzzz, Вы писали:

R>Вот например, есть шаблонный метод:

R>
template <typename T>
R>void foo(const T &a1, const T &a2) noexcept(expr)
R>{
R>    ...
R>    if ((a1 == a2) || (a1 > a2))
R>    ...
R>}
R>

R>После анализа, я делаю вывод что если и могут быть исключения, то только внутри указанной строки кода, причем T может быть также и тривиальным типом. Как это должно быть отражено в noexcept(expr)?

В этом случае необходимо использовать std::declval:

#include <utility>

template <typename T>
void foo(const T& a1, const T& a2)
    noexcept(noexcept((std::declval<T&>() == std::declval<T&>()) || (std::declval<T&>() > std::declval<T&>())))
{
    // ...
    if ((a1 == a2) || (a1 > a2))
    // ...
}


См. пример кода, который успешно компилируется с помощью g++ 6.3.0 и clang++ 3.8.0 при заданных ключах компиляции -std=c++11 -Wall -Wextra -Werror -pedantic-errors.
Re[3]: примеры noexcept(expr)
От: N. I.  
Дата: 30.03.17 09:23
Оценка: 21 (2)
Constructor:

C>Здравствуйте, Ruzzz, Вы писали:


R>>Вот например, есть шаблонный метод:

R>>
template <typename T>
R>>void foo(const T &a1, const T &a2) noexcept(expr)
R>>{
R>>    ...
R>>    if ((a1 == a2) || (a1 > a2))
R>>    ...
R>>}
R>>

R>>После анализа, я делаю вывод что если и могут быть исключения, то только внутри указанной строки кода, причем T может быть также и тривиальным типом. Как это должно быть отражено в noexcept(expr)?

C>В этом случае необходимо использовать std::declval:


Необходимости использовать declval там нет, т.к. в noexcept-specification можно использовать имена параметров функции (так же, как и в trailing-return-type)

template <typename T>
void foo(const T& a1, const T& a2)
    noexcept(noexcept(a1 == a2 || a1 > a2))
{
    // ...
    if (a1 == a2 || a1 > a2)
    // ...
}
Re[4]: примеры noexcept(expr)
От: Alexander G Украина  
Дата: 30.03.17 09:36
Оценка:
Здравствуйте, N. I., Вы писали:

NI>Необходимости использовать declval там нет, т.к. в noexcept-specification можно использовать имена параметров функции (так же, как и в trailing-return-type)

template <typename T>
void foo(const T& a1, const T& a2)
    noexcept(noexcept(a1 == a2 || a1 > a2))
{
    // ...
    if (a1 == a2 || a1 > a2)
    // ...


Всё равно не хочу такую колбасу писать, хочу так
template <typename T>
void foo(const T& a1, const T& a2) noexcept(auto)
{
    // ...
    if (a1 == a2 || a1 > a2)
    // ...
    [[noexcept]]
    {
    // а здесь мы что-то вызвали, что не бросает, но компилятор не знает об этом
    }
}


Русский военный корабль идёт ко дну!
Отредактировано 30.03.2017 9:39 Alexander G . Предыдущая версия .
Re[4]: примеры noexcept(expr)
От: Constructor  
Дата: 30.03.17 09:57
Оценка:
Здравствуйте, N. I., Вы писали:

NI>Необходимости использовать declval там нет, т.к. в noexcept-specification можно использовать имена параметров функции (так же, как и в trailing-return-type)


NI>
template <typename T>
NI>void foo(const T& a1, const T& a2)
NI>    noexcept(noexcept(a1 == a2 || a1 > a2))
NI>{
NI>    // ...
NI>    if (a1 == a2 || a1 > a2)
NI>    // ...
NI>}


В данном конкретном случае необходимости нет.

В общем случае в подозрительной строке/строках могут фигурировать отнюдь не только параметры функции, а какие-нибудь локальные переменные (тип которых может находиться в некой взаимосвязи с параметром шаблона). И тогда std::declval может понадобиться.
Re[5]: примеры noexcept(expr)
От: N. I.  
Дата: 30.03.17 10:11
Оценка: :))
Alexander:

AG>Всё равно не хочу такую колбасу писать, хочу так

AG>
AG>template <typename T>
AG>void foo(const T& a1, const T& a2) noexcept(auto)
AG>{
AG>    // ...
AG>    if (a1 == a2 || a1 > a2)
AG>    // ...
AG>    [[noexcept]]
AG>    {
AG>    // а здесь мы что-то вызвали, что не бросает, но компилятор не знает об этом
AG>    }
AG>}
AG>


Так смогут писать твои внуки, когда соответствующий proposal допилят и включат в стандарт.
Re[5]: примеры noexcept(expr)
От: Constructor  
Дата: 30.03.17 11:11
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Всё равно не хочу такую колбасу писать, хочу так

AG>
AG>template <typename T>
AG>void foo(const T& a1, const T& a2) noexcept(auto)
AG>{
AG>    // ...
AG>    if (a1 == a2 || a1 > a2)
AG>    // ...
AG>    [[noexcept]]
AG>    {
AG>    // а здесь мы что-то вызвали, что не бросает, но компилятор не знает об этом
AG>    }
AG>}
AG>


noexcept(auto) пока нет (где-нибудь в районе C++1917 появится, вероятно), а вот [[noexcept]] вполне можно сымитировать уже сейчас:

[&]() noexcept
{
    // а здесь мы что-то вызвали, что не бросает, но компилятор не знает об этом
}();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.