问题标签 [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.
c++ - 我们如何测试是否可以使用纯右值调用某种类型的表达式?
在c++17中,我们有花哨的is_invocable
新纯右值和花哨的新纯右值,它们并不是真正的值。
这允许您创建一个对象,而不必先从逻辑上构造它,然后省略构造。
我遇到了一个问题,使用std::is_invocable
来测试你是否可以调用某些东西,并且prvalue规则似乎发生冲突:
现在我们可以问是否f
可以使用类型的纯右值调用no_move
?
std::is_invocable< decltype(&f), no_move >
不起作用,因为它使用std::declval<no_move>()
which is an xvalue like no_move&&
not a prvalue of type no_move
。
在c++14中这是相同的,但保证省略使一些函数可以用 xvalue(即“ T&&
”)调用,而另一些函数可以用 prvalues 类型调用T
。
是否有替代方案,或者我们必须发明自己的特征来处理这种情况?
(在一个std::declval<T>
返回T
而不是 ,T&&
的理论世界中is_invocable
,我相信会做正确的事情)。
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()
?
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?
c++ - 检测习语和默认参数类型匹配
我可以编写以下代码来检测对象是否可序列化。
我明白这是表达式 SFINAE 并且仅在表达式的类型是可推导的情况下才选择重载。否则选择默认实现。但是为什么decltype
表达式的结果类型必须与默认参数的类型匹配。如果我编写以下代码,它将不再起作用:
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== 是否存在?)。
c++ - 应该如何编写这个使用 decltype 和 declval 的 c++ typedef 以使其可移植?
我有以下
它的编写是为了让 VS2010 可以有一个适用于特定用例的result_of 。它在 vs2015、vs2013 和 vs2010 下工作,但在 gcc 下我得到一个编译错误
这里有明显的小修复吗?
c++ - VS2010-VS2015下编译时如何使用decltype作为较大类型表达式的LHS
我有两个版本的代码都使用decltype
和declval
。一种有效,一种无效。它们包括在下面。我已经在 VS2017 及更低版本上对此进行了测试,得到了相同的结果。VS2018 会编译它。GCC 和 Clang 都编译它。
在 MSVC 下为失败案例生成的错误是
[x86-64 MSVC 19 2017 RTW #1] 错误 C3646:“类型”:未知覆盖说明符
为线
有关以下代码的实时版本,请参阅God Bolt。
是否可以在不显着更改代码的情况下在 MSVC 2010 上编译代码。上面的代码本身是从大量代码中提取的,除了演示编译器错误之外,不一定有任何意义。
c++ - 将 invoke_result 与 void 参数类型一起使用?
我正在尝试执行以下操作:
std::invoke_result的文档表明它应该可以正常工作(即没有),特别Args
是void
它说 void case 不工作是 now deprecated 的“怪癖” std::result_of
。
但不,void
不起作用。这是有道理的,因为一个也不能做std::declval<T>()
for T = void
,并且std::invoke_result
应该根据std::declval
.
问题是,修补代码以使用 void 的最优雅/直接的方法是什么?我可以做点什么,std::conditional
但我期望更好。(使用 C++17)
c++ - 函数指针有 declval 吗?
我有一个函数,我需要测试是否可以将给定类型的参数传递给它。例如:
调用foo<int, bar>()
有两件事:
- 设置的返回类型
foo
将具有相同的返回类型bar
- 确保这
bar
是一个接受类型参数的函数T
不幸的是,我无法访问auto
模板类型,但我仍然想完成这两个。我需要的是一个decltype
函数指针,它可以让我做这样的事情:
所以我仍然可以打电话foo<int, bar>()
并得到相同的结果。当然没有declval
for 函数指针。但是还有另一种方法可以做到这一点吗?
c++ - 我可以使用 declval 构造未使用的返回吗?
假设我有一个专门的模板化函数,所以我真的不关心基本实现。我可以做这样的事情:
当我尝试在visual-studio-2017中执行此操作时,出现链接错误:
函数中引用的未解析的外部符号
char const && __cdecl std::declval<char const >(void)
(??$declval@$$CBD@std@@YA$$QEBDXZ)char const __cdecl dummy<char const>()
同样,这个函数没有被调用,但我确实保存了一个指向它的指针。我可以return T{}
改用它,并且可以编译,但即使没有默认构造函数,我也需要它来工作T
。有没有办法解决这个问题?