Строковый литерал g++ wchar_t не соответствует ожидаемому типу

(извините, возможно, это не самый актуальный вопрос...)

Согласно https://en.cppreference.com/w/cpp/language/string_literal:
""" Широкий строковый литерал. Тип L"..." строкового литерала: const wchar_t[N] """

однако в этом случае g++, похоже, выбирает const wchar_t*:

auto sw = L"foo";
cout << "type : " << typeid(sw).name() << " >" << sw << "<\n";
cout << "   type : " << typeid( const wchar_t * ).name() << " | type : " << typeid( const wchar_t [] ).name() << "\n";

который дает следующий вывод на GCC 5.4.0:

type : PKw >0x401470<
   type : PKw | type : A_w

Я правильно понял?


person chetzacoalt    schedule 20.04.2020    source источник
comment
совет: используйте abi::__cxa_demangle(typeid(T).name(), 0, 0, 0); из #include <cxxabi.h>, чтобы разобрать имя с помощью g++   -  person Geoffroy    schedule 20.04.2020
comment
const wchar_t * и const wchar_t[N] эквивалентны, поскольку массивы — это просто указатели.   -  person Aplet123    schedule 20.04.2020
comment
@ Aplet123 Совершенно неверно.   -  person Asteroids With Wings    schedule 20.04.2020
comment
@KamilCuk да, это так! Спасибо!   -  person chetzacoalt    schedule 20.04.2020
comment
@Geoffroy, спасибо, это хорошо!   -  person chetzacoalt    schedule 20.04.2020


Ответы (1)


Это ваше использование auto.

auto по значению будет превращать массивы в указатели.

typeid и широкие строковые литералы здесь не имеют строгого значения.

Ваш строковый литерал действительно имеет тип const wchar_t[4], и (вопреки утверждениям в разделе комментариев) он не совпадает с const wchar_t*.

Согласно связанному ответу, мы можем запретить это, переключившись на ссылочный тип (хотя, честно говоря, ew):

auto& sw = L"foo";

(демонстрация)

Старайтесь не использовать auto повсюду без причины. Он делает такие вещи и скрывает результат от вас. Используйте его только тогда, когда это необходимо (например, объявления лямбда) или когда преимущества перевешивают любой потенциальный риск (например, объявления итераторов).

person Asteroids With Wings    schedule 20.04.2020