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

const交换()函数的目的是什么?

穆阳炎
2023-03-14

在实现自定义的元组(此处)时,我发现有一个wiredswap()函数,它接受常量参数(cppreference):

template< class... Types >
constexpr void swap( const std::tuple<Types...>& lhs,
                     const std::tuple<Types...>& rhs ) noexcept(/* see below */);

和一个const限定的swap()成员函数(cppreference):

constexpr void swap( const tuple& other ) noexcept(/* see below */) const;

const意味着对象是只读的,但是要交换两个对象,它必须修改对象,这违反了const-ness。

那么,const swap()函数的用途是什么?

共有3个答案

张唯
2023-03-14

例如,考虑一个类似指针的类型,它可以在不修改指针的情况下交换指针的值:

#include <type_traits>
#include <iostream>

struct foo {
    int * x;
};

void swap(const foo& a, const foo& b){
    std::swap(*a.x,*b.x);
};

int main(){
    int a = 42;
    int b = 3;

    foo f1{&a};
    foo f2{&b};

    swap(f1,f2);

    std::cout << "foo is const swappable: " << std::is_swappable_v<const foo> << "\n";
    std::cout << *f1.x << "\n";
    std::cout << *f2.x << "\n";

}

参考资料中的注释:

也就是说:只有当元组中的类型可以被常量交换时,才能常量交换元组。

柯捷
2023-03-14

你错过了关于过载何时可用的脚注:

仅当std::可交换时,此重载才参与重载解析

如果你有一个类型const_swappable,这样交换(constconst_swappable

祁通
2023-03-14

这是在“zip”提案P2321中引入的,最初在“C 23系列计划”P2214中描述。

P2321

>

  • 交换常量元组和常量对。一旦引用的元组被设置为常量可赋值,就可以为引用的常量元组调用默认的std::swap。然而,这种三步互换做了错误的事情:

    int i = 1, j = 2;
    const auto t1 = std::tie(i), t2 = std::tie(j);
    
    // If std::swap(t1, t2); called the default triple-move std::swap then
    // this would do
    auto tmp = std::move(t1);
    t1 = std::move(t2);
    t2 = std::move(tmp);
    
    // i == 2, j == 2
    

    因此,本文建议为常量元组和常量对添加swap重载,以正确执行元素交换。

    P2214解释了为什么zip的实现需要const可赋值性。它源于赋值操作符没有被引用限定。

  •  类似资料:
    • 所以我看到的代码是这样的: 构造函数用标记这一事实会改变什么?它有任何效果吗? 我读过这篇文章: 对要成为编译时常量的变量使用const。如果const变量在类级别,请将其标记为静态const。(实例变量不能是const。) 但它似乎对类构造函数没有意义。

    • 本文向大家介绍let和const的区别是什么相关面试题,主要包含被问及let和const的区别是什么时的应答技巧和注意事项,需要的朋友参考一下 let和const都是es6引入的新的关键字,let主要解决的是var变量提升导致的全局变量污染问题,let是块级作用域,var是函数作用域,const和let功能一样只是多了一个不可更改的修饰,项目中我们应该多使用const,避免使用var。

    • 问题内容: Java中有XOR函数- 举个例子: 你能告诉我反函数吗?如果有,我能否获得包括数字在内的数字范围? 问题答案: 反之为XOR! 如果你有: 如果您有其他可用值,则可以获取或返回: 例如,如果,(如前所述),您将得到:

    • 因此,使用下面的代码,将参数的类型从更改为(其中)在使用gcc 4.7.2和标志编译时,会导致大约25%的加速,我不明白为什么这会产生如此大的差异。 在下面的函数中调用它(用于做教科书上的长乘法) 计时是通过在循环中调用来完成的,以测量它需要多长时间。不是最精确的方法,但我认为25%的一致性差异意味着这种差异在统计学上是显著的。 完整工作代码块:

    • 在g中运行下面的代码将导致以下错误: 错误:将“const A”传递为“this”参数会丢弃限定符[-fpermissive] 我们在哪里使用? F允许意味着代码不一致。标准在哪里规定这是一个错误?