当前位置: 首页 > 知识库问答 >
问题:

C++20概念:int not swappable_with int

柯瀚海
2023-03-14

我正在试用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;
}

共有2个答案

袁英豪
2023-03-14

使用std::swappable_with -swappable with关心值类别,通过引用编码以及类型。

您实际上是在询问是否可以交换int类型的r值。 它说“不”; 无法交换到rvalueints。

这可能会让人困惑,但如果您这样做:

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类别分别与裸类型一起存储在TU中。

请注意,如果rvalues类型的对象是swappable_with,则上述允许交换rvalues。

公西毅
2023-03-14

std::swappable_with 检查是否可以使用参数std::declval () std::declval()调用swap(在使用std::swap;之后)。 当tuint时,这两个参数都是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(拓