- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试了解尚未合并到标准中的 Concepts Lite TS。我对概念体中短路析取的行为感到困惑。
这是一个小例子:
#include <type_traits>
#include <iostream>
template <typename T, typename ... Ts> concept bool myconcept =
(sizeof...(Ts) == 0) || (std::is_same_v<T, std::common_type_t<Ts...>>);
template <typename ... Ts>
void myfunc(Ts ... args) requires myconcept<int, Ts...> {
(... , (std::cout << args << std::endl));
}
int main() {
myfunc();
return 0;
}
用 gcc 7.1 和 -fconcepts 编译,给出错误:
error: cannot call function 'void myfunc(Ts ...) requires myconcept<int, Ts ...> [with Ts = {}]'
在这个例子中,std::common_type_t<Ts...>
不存在,因为结构 std::common_type<Ts...>
没有成员(member)type
如果Ts = {}
.但是,我认为这应该编译,因为 cppereference.com 关于 concepts and constraints 的文档指出
Disjunctions are evaluated left to right and short-circuited (if the left constraint is satisfied, template argument deduction into the right constraint is not attempted).
自 sizeof...(Ts) == 0
满足,不应在第二个约束和要求 myconcept<int, Ts...>
上尝试模板参数推导应该是满意的。
奇怪的是,将需求直接放入函数声明符会导致程序编译:
#include <type_traits>
#include <iostream>
template <typename ... Ts>
void myfunc(Ts ... args) requires (sizeof...(Ts) == 0) || (std::is_same_v<int, std::common_type_t<Ts...>>) {
(... , (std::cout << args << std::endl));
}
int main() {
myfunc();
return 0;
}
对这种行为有很好的解释吗?谢谢。
最佳答案
出现在cppreference上的外行解释是正确的。从 n4674 draft 中选择措辞也很清楚:
A conjunction is a constraint taking two operands. A conjunction of constraints is satisfied if and only if both operands are satisfied. The satisfaction of a conjunction’s operands are evaluated left-to-right; if the left operand is not satisfied, template arguments are not substituted into the right operand, and the constraint is not satisfied. […]
(来自 17.10.1.1 逻辑运算 [temp.constr.op] §2。)由于所有精确确定我们如何从概念和模板到原子约束的合取或析取的措辞都相当长,我们将坚持外行的解释。
Is there a good explanation for this behavior? Thanks.
在撰写本文时,GCC 的概念实现还处于试验阶段。作为解决方法,您可以将有问题的部分重构为它自己的概念:
template<typename T, typename... Ts>
concept bool refactored = std::is_same_v<T, std::common_type_t<Ts...>>;
template<typename T, typename... Ts>
concept bool myconcept = sizeof...(Ts) == 0 || refactored<T, Ts...>;
关于C++ 概念精简版 : Short-circuiting in concept bodies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44895143/
我正在尝试在elisp中实现我自己的深层复制例程(因为类似(setq newlist oldlist)的东西似乎只能提供浅拷贝,而(copy-sequence newlist oldlist)仍然使n
您好,我正在开发客户端站点的交互性,我觉得我的按钮功能的 JS 和 carousel.fader 窗口的构建有点多余。有人可以看一下这段代码,看看是否可以进一步简化,以减少页面加载时间,实际上只是为了
我一直在优化我的网站,但阻碍我的一个问题是我不使用的所有 jQuery 函数。我唯一使用的是平滑的页面滚动器。这似乎是在浪费下载时间。 我的问题是:是否有任何脚本或程序可以删除我不需要的 jQuery
我在很大程度上不太擅长 javascript/jquery,但我知道如何让一些软件工作。但我的问题是我有一大堆 $("body").on("click", "button#thisid", funct
我的 Eclipse 3.5.2 (Ubuntu 10.10) 安装中安装了多个插件(Apatana、SVN、Pydev、Zend Debugger、PHP)。自从几年前我第一次使用 Eclipse
这个问题在这里已经有了答案: std::forward_list and std::forward_list::push_back (5 个答案) 关闭 5 年前。 我偶然发现了这段代码并试图理解它
我有一个非常简单的 jQuery 脚本,当输入元素获得焦点时,它会将宽度扩展到 250px(使用 focusin() 事件),当失去焦点时,它会缩小使用 focusout() 事件回到 200px。但
我一直在研究为什么 WYSIWYG 编辑器不利于内容创建。给出的最常见原因是它们输出不正确的 html。但是如果我使用功能减少的编辑器怎么办? 我的要求只是斜体、使文本加粗、创建有序/无序列表和(可能
我一直在与 MVVM 模式作斗争,并且在尝试为小型/中型项目创建实用设计时遇到了许多挑战。其中一项挑战是弄清楚如何在不创建大量重复且难以维护的代码的情况下获得与此模式分离的好处。 我目前的策略是创建“
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
从MVC模式和Symfony2的角度来看,我可以瘦身吗? Controller 代码 一点点,移开一些持久化逻辑 ?例如,给定一个标准的新 Action ,如下所示: public function
我打算使用适用于 Android 的 ARM DS5 Streamline。 要将 Streamline 与您的 Android 目标一起使用,您必须构建 Gator 驱动程序 gator.ko 并将
我正在使用 LESS ( http://lesscss.org ),它说 ... JavaScript evaluation JavaScript expressions can be evaluat
我一直在研究使用 EventMachine 为一些工作做后台处理的可能性。在 Sinatra 中,这似乎工作得很好,但 Rails 3 似乎在呈现 View 之前执行所有滴答。 当我在瘦网络服务器下运
if SOMETHING charge = Object (this object has a method ID) end DiffObject.update_attributes(specif
我是一名优秀的程序员,十分优秀!