Почему, когда в конструкторе ссылка на строку не печатается правильно? - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть следующий код, и он не печатает правильную строку, когда ее деструктор называется

struct Tracer {

 Tracer( const std::string& name_in)
 : name{ name_in } {
  std::cout << name << " constructed.\n";
 }

~Tracer() {
 std::cout << name << " destructed.\n";
}

private:

const std::string& name;
};

Tracer static_tracer{ "static Tracer" };

int main() {

}

Вывод: stati c Построитель трассировки.

�1�Q�

Но следующий код работает должным образом:

Tracer( std::string name_in)
 : name{ std:move(name_in) } {
 std::cout << name << " constructed.\n";
 }

private:
std::string name;

Вывод: stati c Трассировка построена.

stati c Трассировка уничтожена.

Или когда используется просмотр строки или простые строки.

Как мы потеряли ссылку на строку во время завершения программы в первом коде?

Также не следует ли потерять ссылку на строка, использующая move (), поскольку она имеет область видимости конструктора?

Спасибо!

1 Ответ

5 голосов
/ 14 апреля 2020

Проблема в том, что вы не можете иметь строковую ссылку (std::string const&) на const char[14], т. Е. "static Tracer".

Чтобы заставить его работать, C ++ изобретает временный объект std::string{"static Tracer"} , Этот объект будет жить до тех пор, пока ваш конструктор не вернет , но больше не будет . Конструктор для static_tracer возвращается до начала main. И, очевидно, деструктор также запускается после возврата конструктора.

...