当前在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 test1;
Test2 test2;
return 0;
}
两者都有可能,只是您使用的语法不正确。是
noexcept((... && std::is_nothrow_default_constructible_v<TYPES>))
或
noexcept(std::conjunction_v<std::is_nothrow_default_constructible<TYPES>...>)
括号需要在第一个选项中绕过entire折叠表达式。第二,逗号是多余的。第二种形式的包扩展已经隐含了逗号分隔的列表。