Пакет параметров внутри спецификатора noexcept - PullRequest
2 голосов
/ 22 января 2020

В настоящее время в C++ ни то, ни другое невозможно, компилятор жалуется, что ожидает выражение.

Для меня это тривиально, если вы создаете объект типа кортежа с переменным c количество типов, как проверить, являются ли все эти типы nothrow default / move / copy constructible?

Это похоже на досадный дефект языка для меня.

Есть ли альтернативы?

#include <iostream>
#include <type_traits>

template <typename... TYPES>
struct Test1 {
    Test1()
    noexcept(... && (std::is_nothrow_default_constructible_v<TYPES>)) {}
};

template <typename... TYPES>
struct Test2 {
    Test2()
    noexcept(std::conjunction_v<std::is_nothrow_default_constructible<TYPES>, ...>) {}
};

int
main() {

    Test1<int, int, int> test1;
    Test2<int, int, int> test2;

    return 0;
}

1 Ответ

4 голосов
/ 22 января 2020

Оба возможны. Вы просто не использовали правильный синтаксис. Это

noexcept((... && std::is_nothrow_default_constructible_v<TYPES>))

или

noexcept(std::conjunction_v<std::is_nothrow_default_constructible<TYPES>...>)

В скобках необходимо go вокруг целого сгиба выражения в первом варианте. А во втором запятая лишняя. Разделенный запятыми список уже подразумевается расширением пакета во второй форме.

...