找到解决方法如何将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
构造函数需要将地址作为第二个参数,但有人可以解释一下使用它是否正确?
答案 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 *
,您的所有问题都将消失。