Size: a a a

2020 April 13

I

Ivan in pro.cxx
https://godbolt.org/z/YZ7ViD
Парни, подскажите, как выкрутиться здесь с стандартом C++1y? С 1z нормально компилится.
Просто не хочется явно писать конструктор от базового в дочернем классе.
источник

AT

Anatoly Tomilov in pro.cxx
плохо ли писать вот так?:
bool/*std::optional/std::variant/std::unique_ptr/etc*/ f()
{
   if (!check1()) {
       return {};
   }
   if (!check2()) {
       return {};
   }
   // ...
   doSomething;
   return true/*constructed object/smart pointer/etc*/;
}

Для bool обязательно возвращать именно false?  Или нормально будет возвращать {}?
источник

AT

Anatoly Tomilov in pro.cxx
Почему sizeof struct { unsigned int i : 24; } — это 4? (вообще не зависит от количества бит битового поля, а только от части unsigned int)
источник

АК

Александр Караев in pro.cxx
Господа, подкиньте цитатой из стандарта. std::string_view s = "123". Имеем ли мы право cчитать, что s.data()[3] == '\0';? Или же это UB, потому что можно читать только [s.data(), s.data() + s.size())?
источник

EP

Egor Pugin in pro.cxx
Александр Караев
Господа, подкиньте цитатой из стандарта. std::string_view s = "123". Имеем ли мы право cчитать, что s.data()[3] == '\0';? Или же это UB, потому что можно читать только [s.data(), s.data() + s.size())?
"123" по умолчанию должно быть asciiz, а вот "123"sv уже интересней
источник

АК

Александр Караев in pro.cxx
Egor Pugin
"123" по умолчанию должно быть asciiz, а вот "123"sv уже интересней
ничего интересного, вопрос как раз про ASCIIZ
источник

EP

Egor Pugin in pro.cxx
Александр Караев
ничего интересного, вопрос как раз про ASCIIZ
"123"sv будет без нуля?
источник

АК

Александр Караев in pro.cxx
Egor Pugin
"123"sv будет без нуля?
С нулём, потому что это эквивалентные конструкции будут.

Вопрос можно поставить иначе. Валиден ли код:
char buf[100] = {};
std::string_view s(buf, buf + 10);
s[30]; // valid?
s.data()[30]; // valid?
источник

AN

Alexander N in pro.cxx
Хмм я вот поглядел кстати, у Qt бэкенд гуя на мобилках OpenGL ES
источник

EP

Egor Pugin in pro.cxx
Александр Караев
С нулём, потому что это эквивалентные конструкции будут.

Вопрос можно поставить иначе. Валиден ли код:
char buf[100] = {};
std::string_view s(buf, buf + 10);
s[30]; // valid?
s.data()[30]; // valid?
а если от обратного, почему не валид?
источник

АК

Александр Караев in pro.cxx
Egor Pugin
а если от обратного, почему не валид?
Я могу лишь предполагать. Как только мы обернули указатель + размер в span/view, мы потеряли информацию о реальном размере и не имеем право выходить за этот диапазон (даже если уверены, что там есть данные).
источник

TS

Till Schneider in pro.cxx
Александр Караев
С нулём, потому что это эквивалентные конструкции будут.

Вопрос можно поставить иначе. Валиден ли код:
char buf[100] = {};
std::string_view s(buf, buf + 10);
s[30]; // valid?
s.data()[30]; // valid?
s[30];
очевидно, что нет
No bounds checking is performed: the behavior is undefined if pos >= size().

а вот, s.data()[30] выглядит вполне валидно
источник

EP

Egor Pugin in pro.cxx
Александр Караев
Я могу лишь предполагать. Как только мы обернули указатель + размер в span/view, мы потеряли информацию о реальном размере и не имеем право выходить за этот диапазон (даже если уверены, что там есть данные).
если данные есть, то я за валидность
источник

АК

Александр Караев in pro.cxx
Посмотрим.
constexpr const_pointer data() const noexcept;
Returns:
data_­
.

constexpr basic_string_view(const charT* str);
# Preconditions: [str, str + traits :: length(str)) is a valid range.
# Effects: Constructs a basic_­string_­view,
initializing data_­ with str
 and initializing size_­ with traits :: length(str).
# Complexity: O(traits::length(str))

Судя по всему, валидно.
источник

v

vehlwn in pro.cxx
Александр Караев
Господа, подкиньте цитатой из стандарта. std::string_view s = "123". Имеем ли мы право cчитать, что s.data()[3] == '\0';? Или же это UB, потому что можно читать только [s.data(), s.data() + s.size())?
Стринг вью не обязан хранить терминатор в конце.
источник

v

vehlwn in pro.cxx
constexpr basic_string_view(const CharT* s, size_type count);
Конструктор без каунта отличатся только тем, что ищет терминатор.
источник

АК

Александр Караев in pro.cxx
vehlwn
Стринг вью не обязан хранить терминатор в конце.
я конкретный пример взял, где литерал "123" (с нулём, очевидно)
источник

v

vehlwn in pro.cxx
Александр Караев
я конкретный пример взял, где литерал "123" (с нулём, очевидно)
У стринг вьюхи нет "конкретных" условий, когда можно выходить за size.
источник

v

vehlwn in pro.cxx
Чем это
std::string_view sv1{"sadfsd"};
Отличается от
const char* p = "asdsadsadsadsadff";
std::string_view sv2{p + 5, 3};
?
источник

v

vehlwn in pro.cxx
Александр Караев
я конкретный пример взял, где литерал "123" (с нулём, очевидно)
Это тупо указатель и длина. Стринг вьюхи даже нельзя конкатенировать.
источник