对数组的第一项的引用的地址

时间:2011-11-17 17:10:55

标签: c++

我对此感到有点困惑:

我认为如果指针指向某个对象,则为某个引用变量指定取消引用仅仅是别名。

示例:

Object * p = &o;
Object & r = *p;
// r and o are the same object

我知道有一些非法案件,例如:

Object * p = NULL;
Object & r = *p; // illegal

现在,下面的代码怎么样?

const char * p = "some string";
const char & r = *p;

const char & r = *"some string";

据说这个特殊情况涉及临时对象,因此我无法得到r的地址,并确保它将指向包含我的初始字符串的内存数组。

C ++标准对该案例有何规定?是否是像NULL规定这样的非法案例,还是允许行为。

换句话说,写一些类似的东西是合法的还是非法的(未定义的行为?)?

   char buffer[100];
   strcpy(buffer, &r);

1 个答案:

答案 0 :(得分:5)

没关系。

字符串文字的数据缓冲区将在程序的持续时间内存在(通常在进程内存的特殊段中)。

  

[C++11: 2.14.5/8]:普通的字符串文字和UTF-8字符串   文字也称为窄字符串文字。 狭窄   string literal 的类型为“ n const char`”数组,其中 n 的大小   如下定义的字符串,具有静态存储持续时间(3.7)。

     

[C++11: 3.7.1/1]:所有没有动态存储空间的变量   持续时间,没有线程存储持续时间,并且不是本地的   静态存储时间这些实体的存储应该持续   程序的持续时间(3.6.2,3.6.3)。

毕竟,这就是保持指针的工作原理!回想一下,指针不会像参考那样神奇地延长对象的生命周期。