Привет ЛОР,
Подскажите, наличествует ли в приведенном коде UB? https://wandbox.org/permlink/6aWOyqM3lln2aJgT
class StringView {
public:
StringView(const char *str, std::size_t size)
: m_str(str),
m_size(size)
{}
const char *data() const { return m_str; }
std::size_t size() const { return m_size; }
private:
const char * const m_str;
const std::size_t m_size;
};
template <typename T>
class NumericStringView : public StringView {
public:
NumericStringView(T value)
// вопрос с топика адресует строчку ниже
: StringView(convertToBuffer(m_buffer, BUFFER_SIZE, value))
{}
private:
static StringView convertToBuffer(char *buffer, std::size_t size, T value) {
auto str = std::to_string(value);
if (str.size() >= size)
throw std::runtime_error("value is too big");
strcpy(buffer, str.c_str());
return StringView(buffer, str.size());
}
private:
constexpr static std::size_t BUFFER_SIZE = 30;
// указатель на данный POD-член передается в родительский конструктор
char m_buffer[BUFFER_SIZE];
};
А именно интересует вызов конструктора базового класса с (неявной) передачей ему указателя на POD член дочернего класса (StringView(convertToBuffer(m_buffer, BUFFER_SIZE, value))
).
P.S. да, я знаю про std::string_view
и в оригинальном коде он и используется. В данном примере StringView
использован для наглядности (см. по ссылке).
P.P.S. В оригинале в convertToBuffer
используется sprintf и черная магия, потому попрошу не придираться к реализаии в примере.