如何使用表达式或运算符来获取右值的地址?
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))));
答案 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))
// ... ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^