问题标签 [declval]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
656 浏览

c++ - 我们如何测试是否可以使用纯右值调用某种类型的表达式?

中,我们有花哨的is_invocable新纯右值和花哨的新纯右值,它们并不是真正的值。

这允许您创建一个对象,而不必先从逻辑上构造它,然后省略构造。

我遇到了一个问题,使用std::is_invocable来测试你是否可以调用某些东西,并且prvalue规则似乎发生冲突:

现在我们可以问是否f可以使用类型的纯右值调用no_move

std::is_invocable< decltype(&f), no_move >不起作用,因为它使用std::declval<no_move>()which is an x​​value like no_move&&not a prvalue of type no_move

中这是相同的,但保证省略使一些函数可以用 xvalue(即“ T&&”)调用,而另一些函数可以用 prvalues 类型调用T

是否有替代方案,或者我们必须发明自己的特征来处理这种情况?

(在一个std::declval<T>返回T而不是 ,T&&的理论世界中is_invocable,我相信会做正确的事情)。

0 投票
1 回答
122 浏览

c++ - std::declval 和未计算的表达式

参考 Proposing Standard Library Support for the C++ Detection Idiom中的以下示例:

表达式如何++declval<T&>()分类为未评估?

在上面,假设declval()返回T&Is there a reason declval 返回 add_rvalue_reference 而不是 add_lvalue_reference 中讨论的那样,表达式的结果++T&(由 产生++declval<T&>)不会变成 odr-used 而不是未评估?根据ODR 使用

如果使用了引用并且在编译时不知道其引用对象,则该引用是 odr-used;

在上述情况下,不是在编译时不知道所指对象吗?在那种情况下,如何首先使用引用declval()

0 投票
1 回答
69 浏览

c++ - Zero Initialize a Type

Given a variable of an unsigned integral type: foo lets say I want to do this:

That gives me the expected 42. But now let's say that I want to do away with the bar variable. So something like this:

But I just get an error:

error: expected primary-expression before decltype

I've also tried declval but that returns a reference, which is also no good. Is there a way I can do this?

0 投票
1 回答
39 浏览

c++ - 检测习语和默认参数类型匹配

我可以编写以下代码来检测对象是否可序列化。

我明白这是表达式 SFINAE 并且仅在表达式的类型是可推导的情况下才选择重载。否则选择默认实现。但是为什么decltype表达式的结果类型必须与默认参数的类型匹配。如果我编写以下代码,它将不再起作用:

0 投票
2 回答
129 浏览

c++ - 类型名的概念/SFINAE 错误

我正在尝试使用新概念语法为自己制作一个简单的示例。我决定测试一个类型是否定义了 operator(),并使用 SFINAE 范例创建了一个结构来测试它,但我遇到了类型问题。这是我的代码:

我开始时没有'typename'指针,只是有

return call_check<type_>::type;,

但我收到了与名称相关的类型错误。添加类型名后,我现在收到

concepts.h:20:78: error: ‘typename Templates::Concepts::call_check<yes>::type’ names ‘template<class type_> using type = decltype (check<type_>(nullptr))’, which is not a type,

我被困住了。坦率地说,我不完全确定实施此 SFINAE 检查的最正确方法是什么,所以我不确定从哪里开始。对于范式和/或概念的任何帮助也将不胜感激。

我确实看到了一个类似的例子

std::declval<type_>()(std::declval<other>(), std::declval<op>()), ...

替换第一次检查的 decltype 调用中的第一项(对于二进制运算符),但我很难理解它是如何转换为函数调用的。(从上到下的第三个答案,供参考:如何检查 operator== 是否存在?)。

0 投票
2 回答
185 浏览

c++ - 应该如何编写这个使用 decltype 和 declval 的 c++ typedef 以使其可移植?

我有以下

它的编写是为了让 VS2010 可以有一个适用于特定用例的result_of 。它在 vs2015、vs2013 和 vs2010 下工作,但在 gcc 下我得到一个编译错误

这里有明显的小修复吗?

0 投票
1 回答
36 浏览

c++ - VS2010-VS2015下编译时如何使用decltype作为较大类型表达式的LHS

我有两个版本的代码都使用decltypedeclval。一种有效,一种无效。它们包括在下面。我已经在 VS2017 及更低版本上对此进行了测试,得到了相同的结果。VS2018 会编译它。GCC 和 Clang 都编译它。

在 MSVC 下为失败案例生成的错误是

[x86-64 MSVC 19 2017 RTW #1] 错误 C3646:“类型”:未知覆盖说明符

为线

有关以下代码的实时版本,请参阅God Bolt

是否可以在不显着更改代码的情况下在 MSVC 2010 上编译代码。上面的代码本身是从大量代码中提取的,除了演示编译器错误之外,不一定有任何意义。

0 投票
1 回答
809 浏览

c++ - 将 invoke_result 与 void 参数类型一起使用?

我正在尝试执行以下操作:

std::invoke_result的文档表明它应该可以正常工作(即没有),特别Argsvoid它说 void case 不工作是 now deprecated 的“怪癖” std::result_of

但不,void不起作用。这是有道理的,因为一个也不能做std::declval<T>()for T = void,并且std::invoke_result应该根据std::declval.

问题是,修补代码以使用 void 的最优雅/直接的方法是什么?我可以做点什么,std::conditional但我期望更好。(使用 C++17)

相关问题:这个这个

0 投票
1 回答
475 浏览

c++ - 函数指针有 declval 吗?

我有一个函数,我需要测试是否可以将给定类型的参数传递给它。例如:

调用foo<int, bar>()有两件事:

  1. 设置的返回类型foo将具有相同的返回类型bar
  2. 确保这bar是一个接受类型参数的函数T

不幸的是,我无法访问auto模板类型,但我仍然想完成这两个。我需要的是一个decltype函数指针,它可以让我做这样的事情:

所以我仍然可以打电话foo<int, bar>()并得到相同的结果。当然没有declvalfor 函数指针。但是还有另一种方法可以做到这一点吗?

0 投票
2 回答
139 浏览

c++ - 我可以使用 declval 构造未使用的返回吗?

假设我有一个专门的模板化函数,所以我真的不关心基本实现。我可以做这样的事情:

当我尝试在中执行此操作时,出现链接错误:

函数中引用的未解析的外部符号char const && __cdecl std::declval<char const >(void)(??$declval@$$CBD@std@@YA$$QEBDXZ)char const __cdecl dummy<char const>()

同样,这个函数没有被调用,但我确实保存了一个指向它的指针。我可以return T{}改用它,并且可以编译,但即使没有默认构造函数,我也需要它来工作T。有没有办法解决这个问题?