我正在试用C++20的概念,std::swappable_with
是未定义的(Visual Studio,使用/std:C++最新的
),或者它的约束与下面的MCVE不匹配(G++10使用-std=C++2a
)--也就是说,int
不能与int
(!)交换。 这是怎么解决的? 如果int
不能与int
交换,我就看不到任何工作。
#include <concepts>
template <typename T, typename U>
requires std::swappable_with<T,U>
void mySwap(T& t, U& u)
{
T temp = t; t = u; u = temp;
}
int main()
{
int x, y;
mySwap(x, y);
return 0;
}
使用std::swappable_with
-swappable with关心值类别,通过引用编码以及类型。
您实际上是在询问是否可以交换int
类型的r值。 它说“不”; 无法交换到rvalueint
s。
这可能会让人困惑,但如果您这样做:
template <class T, class U>
requires std::swappable_with<T,U>
void mySwap(T&& t, U&& u) {
auto temp = std::forward<T>(t);
t = std::forward<U>(u);
u = std::move(temp);
}
它变得更自然了一点。 这里,我们使用转发引用,参数的L/Rvalue类别分别与裸类型一起存储在T
和U
中。
请注意,如果rvalues类型的对象是swappable_with
,则上述允许交换rvalues。
std::swappable_with
检查是否可以使用参数std::declval
和std::declval()
调用swap
(在使用std::swap;之后)。 当
t
和u
是int
时,这两个参数都是rvalue,不能绑定到std::swap
参数,因为这些参数是(非常量)lvalue引用。
您会奇怪
int
不能与int
交换--没错,您不能编写std::swap(1,-1);
。
对于概念,提供了很好的语法,如
在cppreference上,有一个示例定义了概念。我复制了下面的示例: 这个概念对许多用途都有意义。在这些情况下,类型的对象上的哈希函数是专门化。但是,出于我的目的,我不想假设哈希将是。我希望用户能够提供一个不同的哈希函数。 由于和绑定得如此紧密,所以我不认为可以为和定义单独的概念。那是正确的吗?因此,我想定义一个概念,它同时处理和。 null
根据最近科隆ISO C++会议上的reddit报告,在即将发布的标准中,我们将能够指定模板的概念,并且对于每个类/函数模板,我们将能够设置对其类型的约束。然而,在文档和教程中(例如这里),我找不到多类型用例的正确语法。 但它们都抛出语法错误。我认为答案应该在Bjarne Stroustrup的规范P0557中的某个地方,但我很快就找不到了。
英文原文:http://emberjs.com/guides/concepts/core-concepts/ 要开始学习Ember.js,首先要了解一些核心概念。 Ember.js的设计目标是能帮助广大开发者构建能与本地应用相颦美的大型Web应用。要实现这个目标需要新的工具和新的概念。我们花了很大的功夫从Cocoa、Smalltalk等本地应用框架引入了其优秀的理念。 然而,记住Web的特殊性非常
编译器如何准确地使用规则来估计函数的约束程度?当混合不受约束和受约束的过载时,这些规则如何与常规过载解决方案相互作用?
以下概念是理解 API 文档的预备知识。它们将在整个过程中被引用,详细说明请参阅本页面。 如果你是新手,就从 入门指南 开始。 Vinyl Vinyl 是描述文件的元数据对象。Vinyl 实例的主要属性是文件系统中文件核心的 path 和 contents 核心方面。Vinyl 对象可用于描述来自多个源的文件(本地文件系统或任何远程存储选项上)。 Vinyl 适配器 Vinyl 提供了一种描述文件
本页列出了Storm 的主要概念, 以及可以获取到更多信息的资源链接, 概念如下: Topologies(拓扑) Streams(流) Spouts Bolts Stream groupings(流分组) Reliability(可靠性) Tasks Workers Topologies(拓扑) 实时应用程序的逻辑被封装在 Storm topology(拓扑)中. Storm topology(拓