参数包中没有参数说明符

问题描述 投票:0回答:1

当前在C++中都不可行,编译器抱怨它期望一个表达式。

这对我来说似乎微不足道,如果您要构建带有各种参量类型的元组对象,那么如何检查所有这些类型是否为nothrowdefault/move/copyconstructible

这对我来说似乎是一个令人讨厌的语言缺陷。

是否有其他选择?

#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;
}
c++ variadic-templates variadic noexcept parameter-pack
1个回答
0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.