非const引用指向const char的非const指针

时间:2015-07-02 16:11:19

标签: c++ typecasting-operator

为什么我无法在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)
      ^

2 个答案:

答案 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);