使用运算符访问右值地址?
Access the rvalue address using an operator?
如何使用表达式或运算符获取右值的地址?
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))));
内置的寻址运算符需要一个左值操作数,因此您需要以某种方式产生一个左值。
您可以使用 std::move
的某种相反形式将右值转换为左值,此处称为 stay
:
template <typename T>
T & stay(T && x) { return x; }
用法:
std::localtime(&stay(std::time(nullptr))
或者,您可以使用其他一些具有引用参数并提供显式 const
模板参数的预先存在的函数模板,因为右值可以绑定到 constant左值引用。 (通常这是此类接口的一个非常危险的方面("rvalue magnets"),但我们将在此用例中利用它们。)一个示例函数模板可以是 std::min
,但我们可以使用 std::addressof
在这里更方便:
#include <memory>
// ...
std::localtime(std::addressof<const std::time_t>(std::time(nullptr))
// ... ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如何使用表达式或运算符获取右值的地址?
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))));
内置的寻址运算符需要一个左值操作数,因此您需要以某种方式产生一个左值。
您可以使用 std::move
的某种相反形式将右值转换为左值,此处称为 stay
:
template <typename T>
T & stay(T && x) { return x; }
用法:
std::localtime(&stay(std::time(nullptr))
或者,您可以使用其他一些具有引用参数并提供显式 const
模板参数的预先存在的函数模板,因为右值可以绑定到 constant左值引用。 (通常这是此类接口的一个非常危险的方面("rvalue magnets"),但我们将在此用例中利用它们。)一个示例函数模板可以是 std::min
,但我们可以使用 std::addressof
在这里更方便:
#include <memory>
// ...
std::localtime(std::addressof<const std::time_t>(std::time(nullptr))
// ... ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^