在实现自定义的元组
(此处)时,我发现有一个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()函数的用途是什么?
例如,考虑一个类似指针的类型,它可以在不修改指针的情况下交换指针的值:
#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";
}
参考资料中的注释:
也就是说:只有当元组中的类型可以被常量交换时,才能常量交换元组。
这是在“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允许意味着代码不一致。标准在哪里规定这是一个错误?