[英]Why cannot bind ‘const char* const’ lvalue to ‘const char* const&&’?
[英]Why cannot bind ‘const char*’ lvalue to ‘const char* const&&?
我正在练习“C ++ Primer 5th”ex16.63和64,关于这些练习的描述如下。
练习16.63:定义一个函数模板来计算向量中给定值的出现次数。 通过向它传递双精度矢量,整数向量和字符串向量来测试程序。
练习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
是正确的。
左值不能绑定到右值参考。 这是一般规则。 因此,它适用于所有类型,包括const char*
。
您的16.63代码的工作原因是您碰巧传递了rvalues: 1
和3.14
是rvalues,因为它们是非字符串文字。 std::string("python")
是一个右值,因为它是一个临时值。
另一方面, p
是左值。
您可以尝试这样做:
std::cout << VecCount(cVec, std::move(p)) << std::endl;
std :: move函数返回一个右值。 代码运行并生成:
1 2 2
2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.