【问题标题】:Pointer to rvalue object member variable指向右值对象成员变量的指针
【发布时间】:2019-12-04 18:57:24
【问题描述】:

这是一个非常快速的问题。我有以下代码:

struct integer {
    int x;
    int& ref() {
        return x;
    }
};

//main...
int* l = &integer{4}.ref();
std::cout << *l;

我的问题是:&amp;integer{4}.ref() 不是右值,因为它是一个临时对象吗?我怎样才能有一个指向它的指针?它是未定义的行为吗?

【问题讨论】:

  • how can i have a pointer to it?? -- 因为语法是合法的C++?
  • 指针指向integer{4}.x,你可以直接询问它的地址,因为地址存在。但是在该语句之后取消引用指针是 UB,因为它是悬空的(它指向一个不再存在的对象)

标签: c++ pointers rvalue


【解决方案1】:

虽然integer{4} 是一个右值,但您调用ref() 会返回一个始终是左值的int&amp;。这允许代码编译,但您有未定义的行为,因为您取消引用指向不再存在的对象的指针。

要解决这个问题,您可以为ref 提供一个 ref-qualifer,它只允许在左值上调用它。看起来像

struct integer {
    int x;
    int& ref() & {
        return x;
    }
};

如果你尝试使用会导致编译器错误

integer{4}.ref()

因为integer{4} 不是ref 现在需要的左值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2014-01-02
    • 2016-02-25
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多