在 constexpr lambda 的默认模板参数上使用 enable_if

Using enable_if on a defaulted template argument for a constexpr lambda

我正在尝试编写一个将始终 return 一个 -1 的通用函数。我希望模板参数列表默认为 int。我正在尝试使用 std::enable_ifstd::enable_if_t 通过使用 std::is_arithmeticstd::is_arithmetic_v 来测试类型 T 是否是有效的算术类型。我遇到了语法问题,无法正确编译。这是我的 lambda 的样子:

template<typename T = int,
std::enable_if_t<std::is_arithmetic_v<T>> >
static constexpr T negative_one = [](){ 
    return static_cast<T>(-1); 
};

这是一个非常琐碎的函数和概念,但编译器想要抱怨默认参数不在参数列表的末尾......它的正确定义是什么样的?

这就是我的使用方式:

{
    int i = negative_one();
    float f = negative_one<float>();
}

为 sfinae 使用非类型可选模板参数。如果您想将 it/pass 作为谓词调用,您的类型必须是 lambda 类型(而不是 T)。您可以通过自动类型推导来实现这一点。

template<typename T = int, std::enable_if_t<std::is_arithmetic_v<T>, int> = 0>
static constexpr auto negative_one = [](){ 
    return static_cast<T>(-1); 
};

另一种选择是使用函数而不是 lambda:


template<typename T = int, std::enable_if_t<std::is_arithmetic_v<T>, int> = 0>
static constexpr T negative_one() { 
    return static_cast<T>(-1); 
};