gpt4 book ai didi

c++ - 带有函数签名的 Const 关键字

转载 作者:太空狗 更新时间:2023-10-29 20:10:48 26 4
gpt4 key购买 nike

这是我的简单代码:

#include <iostream>

using namespace std;

class alloc { };

template <typename T, typename Alloc = alloc>
class vector
{
public:
void swap(vector<T,Alloc> &v) { cout << "swap()" << endl; }
};


template <typename T, typename Alloc>
void swap(const vector<T,Alloc> &v1,const vector<T,Alloc> &v2)
{
v1.swap(v2);
}

int main()
{
vector<int> x;
vector<int> y;

swap(x,y);

return 0;
}

代码片段运行没有问题。但是我无法得到任何输出

然后我删除 const 关键字。

void swap(vector<T,Alloc> &v1,vector<T,Alloc> &v2)

我得到输出 swap()

我读过“原因是参数的 const 仅在函数内局部应用,因为它正在处理数据的拷贝。这意味着函数签名实际上是相同的。”

所以我觉得写const和不写const没有区别。如果我坚持在这里写const,我该如何修改代码来获取输出swap()

最佳答案

这很好地说明了为什么 using std应该避免。

为了调试这个问题,移除using std , 并添加 std::在你想要标准库行为的地方。幸运的是,只有一个这样的地方,即swap。模板类中的函数:

void swap(vector<T,Alloc> &v) { std::cout << "swap()" << std::endl; }

现在再次尝试编译为see the error阻止你的 swapconst从被使用:

prog.cpp:19:5: error: passing const vector<int> as this argument discards qualifiers

当你的程序是using std C++ 可以选择 std::swap 在你自己的swap当您的功能不适用时使用功能。这正是它所做的,没有任何警告,因为它假设这就是您想要它做的。

该错误还告诉您如何做才能使 const -合格的载体被接受:添加constvector::swap 的参数,像这样:

void swap(const vector<T,Alloc> &v) const { std::cout << "swap()" << std::endl; }

现在您的程序再次编译并运行 ( demo )。

关于c++ - 带有函数签名的 Const 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36808478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com