我对此感到有点困惑:
我认为如果指针指向某个对象,则为某个引用变量指定取消引用仅仅是别名。
示例:
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);
答案 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)。
毕竟,这就是保持指针的工作原理!回想一下,指针不会像参考那样神奇地延长对象的生命周期。