Различия в размере std::string_view массива символов с ненулевым завершением

Я экспериментировал с std::string_view с разными компиляторами и заметил, что каждый компилятор выводит разные размеры при инициализации std::string_view массивом символов с ненулевым завершением. .

Кажется, что каждый компилятор печатает правильный размер при включении оптимизации, но печатает неправильный размер, когда оптимизация выключена (кроме GCC, который печатает правильный размер в обоих случаях).

Мой вопрос: почему это так?

Код:

// test.cpp

#include <iostream>

#ifdef __MINGW32__
#include <experimental/string_view>
#elif _MSC_VER
#include <string_view>
#endif

int main()
{
    const char foo[3]{ 'f','o','o' };

#ifdef __MINGW32__
    std::experimental::string_view str_v{ foo };
#elif _MSC_VER
    std::string_view str_v{ foo };
#endif

    std::cout << sizeof(foo) << " " << str_v.size() << '\n';
}

Вывод: Visual С++ 19.00.24619.0

3 5 // cl /Zi /std:c++latest /EHsc /nologo /W4 test.cpp
3 3 // cl /O2 /std:c++latest /EHsc /nologo /W4 test.cpp

Вывод: Clang 4.0.0-r282394 (с использованием MinGW-w64)

3 4 // clang++ -g --target=x86_64-w64-mingw32 -std=c++1z -Wall -o test.exe test.cpp
3 3 // clang++ -02 --target=x86_64-w64-mingw32 -std=c++1z -Wall -o test.exe test.cpp

Выход: GCC 6.2.0 (MinGW-w64)

3 3 // g++ -g -std=c++1z -Wall -o test.exe test.cpp
3 3 // g++ -O2 -std=c++1z -Wall -o test.exe test.cpp

person JayPhi    schedule 23.10.2016    source источник
comment
Неопределенное поведение не определено.   -  person T.C.    schedule 23.10.2016
comment
Как упоминалось ниже, вам нужно завершать строку нулем с помощью '\0' или использовать строку const char*, которая для вас завершается нулем.   -  person MarcD    schedule 23.10.2016


Ответы (1)


Из cppreference.com:

constexpr basic_string_view (const CharT * s);

Создает представление строки символов с завершающим нулем, на которую указывает s, не включая завершающий нулевой символ.

Ваша тестовая программа вызывает Undefined Behavior, т.к. упомянул в комментарии выше.

person Edgar Rokjān    schedule 23.10.2016
comment
string_view имеет другой конструктор, который принимает count в качестве входных данных, например: string_view str_v{ foo, sizeof(foo) }; - person Remy Lebeau; 23.10.2016
comment
@RemyLebeau Да, определенно, но я решил не упоминать об этом. - person Edgar Rokjān; 23.10.2016