2017-02-02 7 views
3

Найдено решение, как использовать RValue в Lvalue:Rvalue в Lvalue

&(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 конструктор нужен адрес в качестве второго параметра, но может кто-то объяснить это правильно использовать это?

+1

Показать, что 'custom_pair()' на самом деле, пожалуйста. Предоставьте [MCVE] по мере необходимости! Соблюдайте свои вопросы самостоятельно, вместо того, чтобы указывать только на ссылки (они могут использоваться как дополнительная информация). –

+2

Это похоже на неприятности. Хранение адреса временного объекта? – tadman

+0

* Код для этого работает для меня * Что означает * работа * означает в вашем случае? Я подозреваю, что вы столкнетесь с UB, если вы разыщите указатель. –

ответ

2

Это нормально в вашем прецеденте. Временной объект разрушается в точку с запятой после операции «< <». К тому времени он больше не используется.

Будьте осторожны, чтобы не использовать этот шаблон, когда указатель все еще может использоваться после временного уничтожения.

Это, я не принимаю этот код в обзоре кода. У всех, кто читает это, будет слишком много проблем, чтобы определить, почему это работает. Как вы можете видеть по комментариям ниже вашего вопроса.

+0

Да, я понимаю, что это выглядит как ерунда, но работа над этим мотивирует меня сделать этот ответ. –

0

Найдено решение, как использовать RValue в Lvalue

Вам не нужно временное решение о том, как использовать RValue в Lvalue, а исправить код, который вам не нужно это временное решение. Например, второй тип пары должен быть std::string, а не const std::string *, и все ваши проблемы исчезнут.

+0

Это хороший совет, но в этом случае мы делаем копию объекта, так что это не оптимально в памяти с использованием параметра, нет? –

+0

@ ВсеволодИвшин Классическая преждевременная оптимизация –

+0

@ ВсеволодИвшин «преждевременная оптимизация - корень всего зла». До всех значений r, если вы не «конвертируете» его в lvalue, он будет эффективно перемещен в параметр. Таким образом, ваш код будет чистым, читаемым и все еще быстрым. – Slava

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; 

и вы внезапно находитесь на территории УБ.

Смежные вопросы