删除c++中向量的const限定符



是否可以移除向量的常量?如果是这样的话,该如何实现呢?由于某种原因,我无法访问main (),我还能在下面的代码狙击中删除arr的常量吗?感觉auto arr0 = const_cast<vector<int> & > (arr);vector<int> arr0 = arr;完全相同。我想这只是显式和隐式转换的一个例子,它们都创建了原始数组````arr``的副本。是否可以在不创建副本的情况下删除原地的constness?

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> func(const vector<int>& arr){
//    vector<int> arr0 = arr;
auto arr0 = const_cast<vector<int> & > (arr);
sort(arr0.begin(), arr0.end());
return arr0;
}
int main(){
const vector<int> arr = {3,4,1,5,2};
auto res = func(arr);
for (auto n:res)
cout<<n<<" ";
return 0;
}

不要试图丢弃constness。修改const对象将导致未定义的行为。

感觉auto arr0 = const_cast<vector<int> & > (arr);vector<int> arr0 = arr完全相同;

实际上是一样的。演员阵容是多余的。

是否可以在不创建副本的情况下就地删除常量?

如果您希望在不复制的情况下对向量进行排序,那么首先不要将向量设为常量。如果它是const,则不能修改它。

那么在c++中使用const_cast有什么意义?

很少需要它,但也有一些用例。

您可以使用它将非常量glvalue表达式转换为常量表达式:

void fun(T&);       // overload 1
void fun(const T&); // overload 2
T t;
fun(t);                       // calls 1
fun(const_cast<const T&>(t)); // calls 2

若您有一个可证明的非常量对象,并且有一个引用该非常量对象的常量引用,那个么您可以去掉引用的常量:

T t;
const T& ref = t;
const_cast<T&>(ref) = new_value;

同样的情况也适用于volatile限定符,尽管这是很少需要的。

您可以制作一个副本,它实现了您已经尝试做的事情。(您也可以获得返回值优化(。

#include <vector>
#include <algorithm>
template <class T>
static std::vector<T> func(std::vector<T> v) {
std::sort(v.begin(), v.end());
return v;
}

实时示例
您永远不应该尝试修改const变量,这是未定义的行为,它不必做任何事情,它所做的一切都取决于编译器。

您的示例很好。而且没有必要复制。不存在未定义的行为。原因如下。这将arr声明为顶级常量。没有UB,您不能修改对象。但是,const对象不包括动态内存内容。事实上,内容甚至不允许被声明为const。

const vector<int> arr = {3,4,1,5,2};

只要不更改/写入constarr对象,就可以丢弃constness。调用v.begin()v.end()不会改变arr对象,因此不是未定义的行为。我在这里探索了

这不是UB,而是以内联方式对arr进行排序。

void func(const vector<int>& arr){
auto& arr0 = const_cast<vector<int> & > (arr);
sort(arr0.begin(), arr0.end());
}

以下是constexpr函数中的代码示例:

#include <vector>
#include <algorithm>
consteval int foo()
{
const std::vector<int> a = { 1,2,3 };
auto& v = const_cast<std::vector<int>&>(a);
v[0] = 42;
std::sort(v.begin(), v.end());
return a[2];
}
int main()
{
return foo();  // returns 42 since sorted
}

编译器资源管理器

最新更新