2015-10-19 3 views
1

Я нашел очень странное поведение std :: wstring.Ошибка в std :: wstring?

#include "stdafx.h" 
#include <string> 
#include <iostream> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::wstring someString = L"Some dummy string"; 

    std::wstring base1 = L"Base1 "; 
    std::wstring base2 = L"Base2 "; 
    std::wstring second = L"Second"; 

    base1 += second.at(0) + L" "; 

    base2 += second.at(0); 
    base2 += L" "; 

    return 0; 
} 

Основание1 и base2 выход должны быть одинаковыми, но их нет. Base1 на самом деле не работает.

Любые идеи?

+1

Можете ли вы изменить отображение ожидаемого + фактического выхода? это окна? какая версия визуального C++, если это так? Не может быть ошибкой в ​​спецификации. – UmNyobe

ответ

8
second.at(0) + L" " 

Это выражение не делает то, что вы ожидаете. at(0) возвращает wchar_t, что действительно является целым числом. L" " - это широкий строковый литерал, который неявно преобразован в wchar_t const*. Итак, в приведенном выше выражении вы выполняете арифметику указателя, добавляя значение L'S' (вероятно, такое же, как значение ASCII S, что, как мне кажется, равно 83). Это дает вам указатель далеко вне диапазона строкового литерала, который составляет всего 2 символа. Конечным результатом является неопределенное поведение.

Чтобы получить эффект, на который вы, вероятно, собираетесь двигаться, вы можете сделать один из ваших операндов wstring.

base1 += second.at(0) + std::wstring(L" "); 

Возможно, проще в этом случае было бы просто использовать 2 оператора.

base1 += second.at(0); 
base1 += L' '; 
Смежные вопросы