Rvalue作为左值

时间:2017-02-02 19:32:17

标签: c++ memory-address lvalue rvalue

找到解决方法如何将rvalue用作左值:

&(std::string()=std::string("Hello World"));

但不确定使用这种结构是否合法。

与此相同的代码对我有用

typedef std::pair<const char *, const std::string *> custom_pair;

std::ostream & operator <<(std::ostream & os, const custom_pair & kv)
{
    if (kv.first && kv.second && !kv.second->empty())
      os << kv.first << *kv.second;

    return os;
  }

std::ostringstream q;
q << custom_pair("example_string=", &(std::string() = IntToString(1)));

其中custom_pair构造函数需要将地址作为第二个参数,但有人可以解释一下使用它是否正确?

3 个答案:

答案 0 :(得分:2)

你的用例没问题。在“&lt;&lt;”之后的分号处销毁临时对象操作。到那时,它已不再使用。

在临时销毁后仍可使用指针时,请注意不要使用此模式。

那就是说,我不会在代码审查中接受这段代码。阅读本文的每个人都会有太多麻烦来确定它的工作原理。正如您在问题下面的评论中所看到的那样。

答案 1 :(得分:2)

  

但不确定使用这种结构是否合法。

你正在进入UB的边界。

std::ostringstream q;
q << custom_pair("example_string=", &(std::string() = IntToString(1)));

工作正常,因为当指针被取消引用时,所有临时对象仍然存活。将其更改为:

std::ostringstream q;
custom_pair p("example_string=", &(std::string() = IntToString(1)));
q << p;

你突然在UB领域。

答案 2 :(得分:0)

  

找到解决方法如何将rvalue用作左值

您不需要解决方法如何将rvalue用作左值,而是修复您不需要此变通方法的代码。例如,该对的第二种类型应为std::string,而不是const std::string *,您的所有问题都将消失。