- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我最近看了this video解释 C++ 中精简概念的想法,这些概念很可能在今年作为 TS 出现。现在,我还了解了通用引用/转发引用(如 here 所述),并且 T&& 根据上下文可以有两种含义(即是否正在执行类型推导)。这自然会引出概念将如何与通用引用交互的问题?
为了使它具体化,在下面的例子中我们有
void f(int&& i) {}
int i = 0;
f(i); // error, looks for f(int&)
f(0); // fine, calls f(int&&)
和
template <typename T>
void f(T&& test) {}
int i = 0;
f(i); // fine, calls f(T&&) with T = int& (int& && = int&)
f(0); // fine, calls f(T&&) with T = int&& (int&& && = int&&)
但是如果我们使用概念会怎样呢?
template <typename T>
requires Number<T>
void f(T&& test) {}
template <Number T>
void g(T&& test) {}
void h(Number&& test) {}
int i = 0;
f(i); // probably should be fine?
f(0); // should be fine anyway
g(i); // probably also fine?
g(0); // fine anyway
h(i); // fine or not?
h(0); // fine anyway
尤其是最后一个例子让我有点困扰,因为有两个相互冲突的原则。首先,以这种方式使用的概念应该像类型一样工作,其次,如果 T 是推导类型,则 T&& 表示通用引用而不是右值引用。
提前感谢您对此的澄清!
最佳答案
这完全取决于概念本身是如何编写的。 Concepts-Lite 本身(latest TS 在撰写本文时)在这个问题上是不可知的:它定义了可以在语言中定义和使用概念的机制,但不向库中添加库存概念。
另一方面文档N4263 Toward a concept-enabled standard library是标准委员会的一些成员的意向声明,建议在 Concepts-Lite 之后的自然步骤是一个单独的 TS,以将概念添加到标准库中以用于约束,例如算法。
那个 TS 可能有点远,但我们仍然可以看看到目前为止是如何编写概念的。我见过的大多数例子都多少遵循了一个悠久的传统,即一切都围绕着一个假定的、通常不会被认为是引用类型的候选类型。例如,一些较旧的 Concepts-Lite 草稿(例如 N3580 )提到了 Container 等概念,它们的根源在于 SGI STL。并以 23.2 容器要求的形式在标准库中保留至今。
一个明显的预转发引用标志是关联类型的描述如下:
Value type
X::value_type
The type of the object stored in a container. The value type must be Assignable, but need not be DefaultConstructible.
如果我们天真地将其转换为 Concepts-Lite,它可能看起来像:
template<typename X>
concept bool Container = requires(X x) {
typename X::value_type;
// other requirements...
};
在这种情况下,如果我们写
template<typename C>
requires Container<C>
void example(C&& c);
然后我们有以下行为:
std::vector<int> v;
// fine
// this checks Container<std::vector<int>>, and finds
// std::vector<int>::value_type
example(std::move(v));
// not fine
// this checks Container<std::vector<int>&>, and
// references don't have member types
example(v);
value_type
有几种表达方式优雅地处理这种情况的要求。例如。我们可以将要求调整为 typename std::remove_reference_t<X>::value_type
相反。
我相信委员会成员了解情况。例如。安德鲁·萨顿 (Andrew Sutton) 留下了 insightful comment在他的概念库中展示了确切的情况。他的首选解决方案是让概念定义适用于非引用类型,并删除约束中的引用。对于我们的示例:
template<typename C>
// Sutton prefers std::common_type_t<C>,
// effectively the same as std::decay_t<C>
requires<Container<std::remove_reference_t<C>>>
void example(C&& c);
关于c++ - 精简概念将如何与通用引用交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29182279/
我正在尝试在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
我是一名优秀的程序员,十分优秀!