2015-11-15 2 views
0

Comment puis-je utiliser une expression ou un opérateur pour obtenir l'adresse d'une valeur?Accéder à l'adresse de valeur à l'aide d'un opérateur?

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? 

devrait agir comme ceci:

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

Répondre

3

Le haut-adresse de l'opérateur nécessite un opérande lvalue, de sorte que vous devez produire une lvalue en quelque sorte.

Vous pouvez transformer rvalues ​​en lvalues ​​avec une sorte de face de std::move, appelé ici stay:

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

Utilisation:

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

Alternativement, vous pouvez utiliser un autre modèle de fonction pré-existante qui a un paramètre de référence et fournit un argument de modèle const explicite, puisque les valeurs peuvent se lier à constantes références lvalue. (Habituellement, c'est un aspect très dangereux de ces interfaces ("aimants rvalue"), mais nous allons les exploiter ici pour ce cas d'utilisation.) Un exemple de modèle de fonction pourrait être std::min, mais nous pouvons utiliser std::addressof pour encore plus de commodité ici:

#include <memory> 

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

[Demo] (https://ideone.com/s7FD7S) –

+0

donc il n'y a aucun moyen que je peux accéder à l'adresse d'un rvalue en utilisant seulement une expression ou un opérateur, il est pas pris en charge par la norme C++, droit ? – iouvxz

+0

@iouvxz: L'opérateur adresse-de intégré nécessite en effet un opérande lvalue. Vous pouvez également utiliser 'std :: addressof' avec un argument de modèle explicite:' std :: addressof (std :: time (nullptr)) '. C'est une méthode similaire à celle que j'ai présentée. Je vais mettre à jour le post. –