我有这段 C++ 代码,我觉得有点困惑:
int foo (const char* &bar)
在这种情况下,如果我想将条形指针写入:
bar = ...
没关系。那么我应该如何理解这一点const
。与指针不同的 const 指针如何指向 const 值?
const
适用于它左边的任何东西,除非它左边没有任何东西,在这种情况下,它适用于它右边的任何东西。这意味着在您的情况下,bar
是对指向 a 的指针的引用const char
。 bar
本身不是恒定的,可以修改。
如果您更改bar
为 be char * const &bar
,即 - 对指向 的常量指针的引用char
,您将无法进行该分配。例子:
int foo (char * const &bar)
{
bar = 0;
return 1;
}
并尝试编译它:
$ clang++ -c -o example.o example.cpp
example.cpp:3:9: error: read-only variable is not assignable
bar = 0;
~~~ ^
1 error generated.
make: *** [example.o] Error 1
如果它们给您带来麻烦,您可以使用cdecl
/c++decl
来解析这些声明:
$ c++decl
Type `help' or `?' for help
c++decl> explain const char * &bar
declare bar as reference to pointer to const char
c++decl> explain char * const &bar
declare bar as reference to const pointer to char
如果指针是const
,则不允许分配给指针。例如
char * const bar;
bar = ...; // This is invalid
*bar = ...; // This is OK
bar[i] = ...; // This is OK
如果指针指向一个const
值,则不允许分配指针指向的内容。例如
const char *bar;
bar = ...; // This is OK
*bar = ...; // This is invalid
bar[i] = ...; // This is invalid
我将添加一些示例。也许这会让一些人更清楚:
这些空间在其中任何一个中都没有区别,所以我将它们放在任何地方以避免歧义。
const char * & bar
bar
is not const, *bar
is const (这也意味着bar[0]
, 等等)。如果更改bar
,它现在将指向新内存(如新数组),但旧数据将保持不变。
char const * & bar
和上面一样。
char * const & bar
bar
现在是 const (您不能将其更改为指向不同的内存),但内存本身 ( *bar
) 可以更改
const char * const & bar
bar
并且*bar
都是常量。你不能改变任何东西。
char * & const bar
这是一个错误。
您找到的代码使用第一种形式(实际上)返回一个const char
数组。调用者不允许传递char*
; 它必须是 a const char*
,所以除非调用者抛弃 const-ness (这是一件坏事),否则他们不会修改内存。这意味着函数可以安全地返回指向内部数据的指针,知道它不会被修改。