为什么我无法在s2
中引用foo
?我正在使用gcc 5.1.0进行编译:
#include <cstring>
void foo(const char*& p)
{
while (*p && *p <= '5')
++p;
}
int main()
{
const char *s1 = "1234567890";
char *s2 = new char[strlen(s1) + 1];
strcpy(s2, s1);
foo(s1); // OK
foo(s2); // error
return 0;
}
我编译:
$ g++ test_reference.cpp
编译器给了我:
test_reference.cpp: In function ‘int main()’:
test_reference.cpp:16:11: error: invalid initialization of non-const reference of type ‘const char*&’ from an rvalue of type ‘const char*’
foo(s2); // error
^
test_reference.cpp:3:6: note: initializing argument 1 of ‘void foo(const char*&)’
void foo(const char*& p)
^
答案 0 :(得分:3)
为简单起见,您正在尝试:
char* s = ...;
const char*& r = s;
这里的const
可能会产生误导。你会认为这相当于:
int i = 4;
const int& ri = i;
哪个有效。但这些并不等同。 ri
这里是对const类型的引用,但是r
是对const char
指针的引用,即不是 const类型。
最终的问题是char*
和char const*
不是与参考相关的(意味着类型相同或在同一层次结构中)。但是,如果您的引用是对const
类型的引用,那么它将正常工作。那就是:
const char* const& cr = s;
基本上,您只能从引用相关类型或可转换为引用相关类型的类中对非const类型T
进行左值引用。但是你可以从更广泛的表达式源中对const类型进行左值引用:
double d = 4.0;
int& ri = d; // error: int, double aren't reference-related
const int& rci = d; // OK
答案 1 :(得分:0)
您可以将其强制转换为const引用。
foo((const char *&) s2);