将右值与 & 运算符一起使用

Posted

技术标签:

【中文标题】将右值与 & 运算符一起使用【英文标题】:Using rvalues with the & operator 【发布时间】:2020-12-29 12:59:13 【问题描述】:

我一直在努力理解下面的 C 代码:

struct s 
        char m1;
        char m2;
;

int  main()

    /* This will print 1 */
    printf("%d\n", &((struct s*)0)->m2);


下面的部分在稍作修改后似乎有点混乱:

&((struct s*)0)->m2

在编译和运行初始代码时,我得到的答案是 1,这是我希望得到的。

我修改了代码,将&((struct s*)0)->m2 替换为 &((struct s*)0),然后我收到一条错误消息,提示“需要左值作为一元 '&' 操作数”。

问题:在原始代码部分&((struct s*)0)->m2 中,& 的参数不是右值吗?如果是,那为什么编译成功,而修改&((struct s*)0)的情况下却没有?

【问题讨论】:

【参考方案1】:

在这种情况下:

 &((struct s*)0)

& 的操作数是强制转换的结果,它总是一个右值。在这种情况下:

&((struct s*)0)->m2

& 的操作数是 -> 运算符的结果,它是一个左值,特别是命名字段。另请注意,此表达式会导致 undefined behavior,因为通过 -> 运算符取消引用 NULL 指针值。

【讨论】:

以上是关于将右值与 & 运算符一起使用的主要内容,如果未能解决你的问题,请参考以下文章

可以将右值移动到 shared_ptr 中吗

将右值引用绑定到(自动生成的)左值

如何将右值引用从调用者传递给被调用者

认识左值与常引用

JavaScript-运算符

右值引用重载 && 运算符