Как проверить конструктор оператором noexcept

159
04 июня 2019, 17:00

Есть, к примеру, такая функция:

template<typename T>
auto foo(const T & stuff) noexcept(noexcept(bar(stuff)))
{
    return bar(stuff);
}

Вопрос, как проверить в noexcept копирующий/перемещающий конструктор того что вернет bar(stuff)?

Answer 1

В С++17 в этом коде копирующий или перемещающий конструктор для объекта, возвращаемого bar, вызываться не будет. Новые правила предписывают максимальное откладывание непосредственного создания объекта с исключением промежуточных копий. Например этот код будет рабочим, даже несмотря на запрет копирующих / перемещающих конструкторов:

class A;
A bar(int const x);
class A
{
    friend A bar(int const x);
    private: A(void) = delete;
    private: A(A const & other) = delete;
    private: A(A && other) = delete;
    private: explicit A(int const x) : m_x{x} {}
    private: A & operator =(A const & other) = delete;
    private: A & operator =(A && other) = delete;
    private: [[maybe_unused]] int m_x;
};
A bar(int const x) { return A{x}; }
template<typename T>
auto foo(T const & stuff) noexcept(noexcept(bar(stuff)))
{
    return bar(stuff);
}
int main() 
{
    [[maybe_unused]] A a{foo(1)};
    return 0;
}

online compiler

Answer 2

Почему так нельзя?

template<typename T>
auto foo(const T& stuff) noexcept(noexcept(decltype(bar(stuff)){decltype(bar(stuff)){}})) {
    return bar(stuff);
}

Для перемещающего ещё declval накинуть.

READ ALSO
Что означает единственный знак ; в строке?

Что означает единственный знак ; в строке?

Что означает строка в main? Для чего такая конструкция нужна?

133
Ошибка сегментации в linked list

Ошибка сегментации в linked list

Есть функция deleteLast, которая удаляет первый элемент linkedlist'а

110
Рекурсивный вызов main

Рекурсивный вызов main

Что будет при рекурсивном вызове функции main???

107
Изменить кодировку символа в C++

Изменить кодировку символа в C++

Так уж пришлось, что мне нужно сделать задание в C++ builder 6И такой вопрос, как изменить маленькую букву на большую через изменение кода символа

132