Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共轭模板不';t短路_C++_Templates_C++17_Short Circuiting - Fatal编程技术网

C++ 共轭模板不';t短路

C++ 共轭模板不';t短路,c++,templates,c++17,short-circuiting,C++,Templates,C++17,Short Circuiting,我希望能够评估函数是否接受int类型的一个参数,以及它是否返回void。为此,我使用了std::conjunction,因为我认为如果函数不能用int类型的一个参数调用,那么它应该短路,并且不会计算第二个格式错误的表达式,但出于某种原因,我得到了一个编译器错误: #include <iostream> #include <type_traits> template<typename Function> struct oneArgVoid { stati

我希望能够评估函数是否接受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;
}
#包括
#包括
模板
结构oneArgVoid
{
静态constexpr bool value=std::conjunction\u v;
};
int main()
{
自动l1=[](自动x){};

std::cout似乎只有在类型的值上短路,类型本身仍然必须格式良好。因此:
std::is_void
在这里实际上是非法的。由于修改:

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>>;
};
模板
结构argVoid
{
静态constexpr bool value=std::is\u void\u v;
};
模板
结构oneArgVoid
{
静态constexpr bool value=std::conjunction\u v;
};

它可以工作,因为格式错误的表达式现在在value变量中,这意味着由于短路,它不会得到计算。

@HolyBlackCat似乎没有按预期工作:似乎int可以转换为void?
确定是否可以使用参数ArgTypes调用Fn…以生成可转换为R的结果。