Я озадачен следующей разницей, обнаруженной при попытке воспроизвести другую ошибку. Эта программа работает так, как ожидалось:
#include <memory>
#include <string>
#include <iostream>
int main() {
std::string s = "Hi\n";
std::cout << s;
auto p = std::make_unique<const char *>(s.c_str());
std::cout << *(p.get());
return 0;
}
Он печатает
Hi
Hi
Но добавление одного ключевого слова volatile:
#include <memory>
#include <string>
#include <iostream>
int main() {
std::string s = "Hi\n";
std::cout << s;
auto p = std::make_unique<volatile const char *>(s.c_str());
std::cout << *(p.get());
return 0;
}
заставляет его печатать:
Hi
1
Это тоже не помогло:
#include <memory>
#include <string>
#include <iostream>
int main() {
std::string s = "Hi\n";
std::cout << s;
auto p = std::make_unique<volatile const char *>(reinterpret_cast<volatile const char *>(s.c_str()));
std::cout << *(p.get());
return 0;
}
Почему?
std::ostream имеет перегрузку для operator << для const char* и bool (указатель имеет преобразование в bool), а не для volatile const char *volatile имеет очень мало применений. Я сомневаюсь, что ваша исходная проблема нуждается в volatile.
Спасибо, @ Jarod42, это действительно так, как показала моя проверка ваших гипотез здесь. Исходная ошибка может быть связана или не связана с использованием volatile, а volatile используется из-за факта использования переменной во встроенной системе. Исходная ошибка, скорее всего, связана с использованием интеллектуальных указателей.
пожалуйста, не добавляйте ответ на вопрос. Вместо этого вы должны опубликовать это как ответ. Вы даже можете принять свой собственный ответ.
Остерегайтесь, что вы ставите unique_ptr предмет, которым вы не владеете. std::string имеет уникальное право собственности на данные указанного символа и не передает это право unique_ptr. Вы получите Undefined Behavior из-за двойной delete или аналогичной двойной очистки в конце области.
@ 463035818_is_not_an_ai Чувствовалось бы, что я присвоил себе ответ Jarod42.
@RomanPavelka Если бы их это заботило, они бы вместо этого разместили комментарий в качестве ответа.
они дали свой комментарий. С ним можно делать что угодно ;)
просто добавьте ссылку на комментарий, и все в порядке. Что-то вроде "Как указал Джарод в комментарии..."
Оффтопик: std::make_unique<const char *> уже кодмелл?
Пожалуйста, проверьте cppinsights (нажмите кнопку воспроизведения). Это показывает, что для обоих случаев выбрана разная перегрузка оператора.





Ответ в комментарии от Jarod42:
std::ostreamимеет перегрузку для оператора<<дляconst char*иbool(указатель имеет преобразование вbool), но не дляvolatile const char *
Затем разницу можно воспроизвести просто:
#include <iostream>
int main() {
/*volatile*/ const char * s = "abc\n";
std::cout << s;
return 0;
}
Дает abc с закомментированным volatile и 1 (без новой строки) с раскомментированием.
Для справки оператор << и оператор <<. Таким образом, в С++ 23 адрес будет напечатан вместо 1 для volatile случая.
Хорошая демонстрация: cppinsights показывает, что для обоих случаев выбрана разная перегрузка оператора.
Просто добавить его без особой причины? Я предполагаю, что средство форматирования думает, что это нечто иное, чем строка C.