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