0

以下内容无法编译:

  template<typename... Args>
  void check_format(Args&&... args)
  {
      static_assert((true && std::is_fundamental<decltype(args)>::value)...);
  }
4

2 回答 2

5

这应该有效:

static_assert((std::is_fundamental_v<Args> && ...));

Godbolt 的更长示例:https ://gcc.godbolt.org/z/9yNf15

#include <type_traits>

template<typename... Args>
constexpr bool check_format(Args&&... args)
{
    return (std::is_fundamental_v<Args> && ...);
}

int main() {
    static_assert(check_format(1, 2, 3));
    static_assert(check_format(nullptr));
    static_assert(!check_format("a"));
    static_assert(check_format());
    struct Foo {};
    static_assert(!check_format(Foo{}));
}
于 2019-10-10T13:42:27.177 回答
4

您的尝试看起来像是一元和二元折叠表达式的混合。作为一元或二元折叠的表达式的正确形式是

static_assert((... && std::is_fundamental<decltype(args)>::value));         // unary
static_assert((true && ... && std::is_fundamental<decltype(args)>::value)); // binary

一元形式有效,因为空序列隐式等效于true.

顺便说一句,decltype(args)总是会是一个引用类型,无论是左值还是右值。您可能希望std::remove_reference_t从这些类型中获取。并且您也可以使用std::remove_reference_t<Args>以方便编写。

于 2019-10-10T13:35:29.070 回答