Есть, к примеру, такая функция:
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 накинуть.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости