noexcept 说明符中的参数包
Parameter pack inside noexcept specifier
目前 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;
}
两者皆有可能。您只是没有使用正确的语法。这是
noexcept((... && std::is_nothrow_default_constructible_v<TYPES>))
或
noexcept(std::conjunction_v<std::is_nothrow_default_constructible<TYPES>...>)
括号需要围绕第一个选项中的 整个 折叠表达式。在第二个中,逗号是多余的。第二种形式的包扩展已经隐含了逗号分隔列表。
目前 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;
}
两者皆有可能。您只是没有使用正确的语法。这是
noexcept((... && std::is_nothrow_default_constructible_v<TYPES>))
或
noexcept(std::conjunction_v<std::is_nothrow_default_constructible<TYPES>...>)
括号需要围绕第一个选项中的 整个 折叠表达式。在第二个中,逗号是多余的。第二种形式的包扩展已经隐含了逗号分隔列表。