指针返回类型的函数是rvalue

时间:2015-02-09 11:52:52

标签: c++

struct A {
   char f1() {return *c;} // 1) f1() is rvalue
   char * f2(){return c;}  // 2) f1() is rvalue
   char & f3(){return *c;} // 3) f1() is lvalue
   char * c;
};

int main () {
 char * a = "string"; // 4)  it can be readable, when writed to a, problem will crash, why ?
 const char * ab = "string"; // 5) ab is READ-ONLY 

}

问题

a)对于第2行)为什么带指针返回类型的函数是rvalue,而不是左值?

b)对于第4)和第5行,什么是“字符串”的类型?一个“常见问题*”?更多有趣的知识,它位于哪个内存部位?

5 个答案:

答案 0 :(得分:3)

  

为什么带指针返回类型的函数是rvalue,而不是左值?

因为指针是一个对象,如果返回类型是一个对象类型,函数调用的结果总是 rvalue 。取消引用指针将给出左值表示它指向的对象。

  

当写入a时,问题会崩溃,为什么?

因为字符串文字是const,并且写入它们会给出未定义的行为。在现代C ++中,没有隐式转换为非const char*,因此您的示例不会编译。从历史上看,这种狡猾的转变是出于神秘的原因。我建议你考虑使用一个更新的编译器,指定C ++ 11或C ++ 14作为语言方言,以防止这种肮脏。至少,启用编译器警告。

  

"string"的真正含义是什么?

一个常量字符数组,大小足以容纳字符串文字中的字符加零终结符。在这种情况下,char const[7]

  

更多知道,它位于哪个内存部位?

字符串文字是常量,并且具有静态存储持续时间,因此通常存储在只读数据段中。没有具体说明具有相同值的两个文字是指同一个静态数组,还是两个独立的数组。

答案 1 :(得分:1)

a)第2行返回类型(char *)中的一些右值。它是(char *)的右值.char *只是一个类似int或char.in第3行它是左值,因为有(char&并且它发送回参考(左值)。

b)“string”是一个const char *变量,因为你不能用char *读取或写入,如果你尝试,你会触发未定义的行为。

答案 2 :(得分:1)

char f1() {return *c;} // 1) f1() is rvalue

* c是指针c指向的值

 char * f2(){return c;}  // 2) f1() is rvalue

f2()现在指向c指向的地址,现在是* f2()保存c指向的值。

答案 3 :(得分:1)

  

当写入a时,问题会崩溃,为什么?

Attempting to modify a string literal results in undefined behavior代表cppreference。在相关的说明中,在c ++ 03中不推荐将字符串文字指定给非const char指针,并且自c ++ 11以来一直禁止使用。

a)您可能是指函数返回的值。副本返回的值始终是右值。

b)文字"string"的类型为const char[7],并且具有静态存储持续时间。 通常存储在只读数据段中,例如.rodata,但未由语言指定。

答案 4 :(得分:0)

a)函数char* f2()返回一个值(粗略地说,一个代表内存地址的数字)。与返回值(另一个数字)的函数char f1()相同。

另一方面,

函数char& f3()返回对变量的引用。

b)正如Anton Savin所指出的那样,“string”是const char[7],对于现代编译器(C ++ 11),第一项任务是非法的。第一个字符's'的内存位置可以轻松读入ab