Есть, к примеру, такая функция:
template<typename T>
auto foo(const T & stuff) noexcept(noexcept(bar(stuff)))
{
return bar(stuff);
}
Вопрос, как проверить в noexcept
копирующий/перемещающий конструктор того что вернет bar(stuff)
?
В С++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
Почему так нельзя?
template<typename T>
auto foo(const T& stuff) noexcept(noexcept(decltype(bar(stuff)){decltype(bar(stuff)){}})) {
return bar(stuff);
}
Для перемещающего ещё declval накинуть.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Что означает строка в main? Для чего такая конструкция нужна?
Есть функция deleteLast, которая удаляет первый элемент linkedlist'а
Так уж пришлось, что мне нужно сделать задание в C++ builder 6И такой вопрос, как изменить маленькую букву на большую через изменение кода символа