2

目前在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;
}
4

1 回答 1

4

两者都是可能的。您只是没有使用正确的语法。它是

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

或者

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

括号需要绕过第一个选项中的整个折叠表达式。在第二个中,逗号是多余的。第二种形式的包扩展已经暗示了逗号分隔的列表。

于 2020-01-22T11:56:43.423 回答