gpt4 book ai didi

c++ - 连词模板不会短路

转载 作者:太空狗 更新时间:2023-10-29 22:54:11 26 4
gpt4 key购买 nike

我希望能够评估一个函数是否接受一个 int 类型的参数,以及它是否返回 void。为此,我使用了 std::conjunction,因为我认为它应该短路而不计算第二个格式错误的表达式,以防函数不能用一个 int 类型的参数调用,但是由于某种原因,我得到一个编译器错误:

#include <iostream>
#include <type_traits>
template<typename Function>
struct oneArgVoid
{
static constexpr bool value = std::conjunction_v<std::is_invocable<Function, int>, std::is_void<std::invoke_result_t<Function, int>>>;
};

int main()
{
auto l1 = [](auto x) {};
std::cout << oneArgVoid<decltype(l1)>::value << "\n";
auto l2 = [](auto x) {return 1; };
std::cout << oneArgVoid<decltype(l2)>::value << "\n";
auto l3 = [](auto x, auto y) {};
std::cout << oneArgVoid<decltype(l3)>::value << "\n";
return 0;
}

请注意,如果未在 l3 上调用 oneArgVoid,则代码会编译。现场演示:https://godbolt.org/z/8BUfpT

我不使用 boost,所以我不能使用 mpl::eval_if。但我认为 std::conjunction 应该在这里短路,我错了吗?

考虑到 HolyBlackCat 的建议,这里有一些更奇怪的东西:https://godbolt.org/z/2SUij-

最佳答案

好像std::conjunction仅在类型的值上短路,类型本身仍然必须是良构的。所以这个:std::is_void<std::invoke_result_t<Function, int>>在这里实际上是非法的。由于修改:

template<typename Function>
struct argVoid
{
static constexpr bool value = std::is_void_v<std::invoke_result_t<Function, int>>;
};

template<typename Function>
struct oneArgVoid
{
static constexpr bool value = std::conjunction_v<std::is_invocable<Function, int>, argVoid<Function>>;
};

它起作用了,因为格式错误的表达式现在位于值变量中,这意味着它不会因短路而被计算。

关于c++ - 连词模板不会短路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57018826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com