使用运算符访问右值地址?

时间:2015-11-15 00:47:26

标签: c++ reference rvalue

如何使用表达式或运算符来获取右值的地址?

char buffer[100];
time_t rawtime=time(nullptr); //rawtime used only once ,after that it's abandoned.
strftime(buffer, 80, "%y%m%d %H%M%S", localtime(&rawtime));// rewrite these two lines into one line?

应该这样:

strftime(buffer, 80, "%y%m%d %H%M%S", localtime(&(time(nullptr))));

1 个答案:

答案 0 :(得分:3)

内置的address-of运算符需要一个左值操作数,所以你需要以某种方式产生一个左值。

您可以将rvalues转换为与std::move相反的左值的左值,此处称为stay

template <typename T>
T & stay(T && x) { return x; }

用法:

std::localtime(&stay(std::time(nullptr))

或者,您可以使用其他一些具有引用参数的预先存在的函数模板,并提供显式const模板参数,因为rvalues可以绑定到常量左值引用。 (通常这是这种接口的一个非常危险的方面(&#34; rvalue magnet&#34;),但是我们在这里将它们用于此用例。)一个示例函数模板可以是std::min,但我们可以使用std::addressof来获得更大的便利:

#include <memory>

// ...
std::localtime(std::addressof<const std::time_t>(std::time(nullptr))
// ...         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^