gpt4 book ai didi

c++ - 为什么不能将 ‘const char*’ 左值绑定(bind)到‘const char* const&&?

转载 作者:行者123 更新时间:2023-11-30 02:41:06 25 4
gpt4 key购买 nike

我正在做《C++ Primer 5th》ex16.63 和 64 的练习,下面是关于这些练习的描述。

练习 16.63:定义一个函数模板来计算 vector 中给定值的出现次数。通过向程序传递一个 double vector 、一个整数 vector 和一个字符串 vector 来测试您的程序。

练习 16.64:从之前处理 vector< const char* > 的练习和一个程序使用此特化。

这是我的代码:

#include <iostream>
#include <vector>
#include <string>

// ex16_63
template<typename T>
std::size_t VecCount(const std::vector<T> &vec, const T &&val){
std::size_t num = 0;
for(auto i: vec){
if(val == i) ++num;
}
return num;
}

//ex16_64
template<>
std::size_t VecCount(const std::vector<const char*> &vec, const char* const &&val){
std::size_t num = 0;
for(auto i: vec){
if(val == i)++num;
}
return num;
}

int main()
{
// ex16_63
std::vector<int> nVec = {1, 2, 3};
std::vector<double> dVec = {3.14, 2.24, 3.14};
std::vector<std::string> sVec = {"hello", "python", "python"};
std::cout << VecCount(nVec, 1) << ' '
<< VecCount(dVec, 3.14) << ' '
<< VecCount(sVec, std::string("python")) << std::endl;

// ex16_64
std::vector<const char*> cVec = {"world", "turing", "turing"};
const char *p = "turing";
std::cout << VecCount(cVec, p) << std::endl; // wrong
//std::cout << VecCount(cVec, std::move(p)) << std::endl; // correct
return 0;
}

编译ex16_64时出现错误:

error: cannot bind ‘const char*’ lvalue to ‘const char* const&&’ std::cout << VecCount(cVec, p) << std::endl;

我不明白我关于 ex16_64 的代码在没有 std::move 的情况下是错误的,而我关于 ex16_63 的代码是正确的。

最佳答案

左值不能绑定(bind)到右值引用。这是一般规则。因此,它适用于所有类型,包括 const char*

您的 16.63 代码有效的原因是您碰巧将右值传递给:13.14 是右值,因为它们是非字符串文字。 std::string("python") 是右值,因为它是临时的。

另一方面,

p 是一个左值。

关于c++ - 为什么不能将 ‘const char*’ 左值绑定(bind)到‘const char* const&&?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28482946/

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