Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++ 是否忽略返回参数_C++_Templates_C++17 - Fatal编程技术网

C++ 是否忽略返回参数

C++ 是否忽略返回参数,c++,templates,c++17,C++,Templates,C++17,在对我关于std::conjunctionnot short circuiting())的问题的评论中,有人建议我将std::is_invocable_r作为解决问题的方法。然而,当我试图使用它时,我发现了一些非常奇怪的行为。例如,此代码使两个断言都失败: #include <type_traits> int main() { static_assert(!std::is_invocable_r_v<void, int(int), int>); stat

在对我关于
std::conjunction
not short circuiting())的问题的评论中,有人建议我将
std::is_invocable_r
作为解决问题的方法。然而,当我试图使用它时,我发现了一些非常奇怪的行为。例如,此代码使两个断言都失败:

#include <type_traits>

int main()
{
    static_assert(!std::is_invocable_r_v<void, int(int), int>);
    static_assert(std::is_convertible_v<int,void>);
    return 0;
}
#包括
int main()
{
静态断言(!std::is\u invocable\u r\u v);
静态断言(std::is_convertible_v);
返回0;
}
请注意,
的说明在以下位置:

确定是否可以使用参数
ArgTypes…
调用
Fn
,以生成可转换为
R
的结果

显然,
int
不能转换为
void
,第二个断言确认了这一点。问题是为什么
std::is\u invocable\u r\u v
会产生
true
值。下面是一个活生生的例子:

注意,可以使用
std::is\u void\u v
在此处获得正确答案(),但这不是我的问题。(这并不能解决我的连词问题)。

紧接着

确定是否可以使用参数
ArgTypes…
调用
Fn
,以生成可转换为
R
的结果

它给出了更严格的定义:

。。。形式上,确定
是否调用(declval(),declval

在本文中,我们解释了
INVOKE
是一种特殊情况。它不是隐式地将返回值转换为
R
,而是使用
静态转换(…)
(这对于任何返回类型都是格式良好的).

您可能会阅读
INVOKE
的定义,该定义对于
void
确实有特殊的行为。Wait
static\u cast(…)
适用于任何返回类型,但是
是否可转换
为false?这两种定义如何一致?只需忽略“确定是否可以使用参数ArgTypes调用Fn…以生成可转换为R的结果。”第二部分。在我看来,该页面试图给您一个简单的不精确的解释(“result…可转换为R”),然后详细说明这到底意味着什么(如果
R
不是
void
,则结果必须隐式转换为
R
,否则结果可以有任何类型)。