Можно ли передать строковый литерал в функцию, которая принимает const char *? - PullRequest
0 голосов
/ 04 мая 2019

Мне нужна помощь в понимании некоторого кода.

Я прочитал в других местах , что передача строкового литерала в качестве const char* является законной. Но в последней строке этот код из cppreference для пользовательских строковых литералов говорит, что для "two" нет литерального оператора. Почему, если строковый литерал "two" может быть передан функции, принимающей const char*?

long double operator "" _w(long double);
std::string operator "" _w(const char16_t*, size_t);
unsigned operator "" _w(const char*);


int main() {
    1.2_w; // calls operator "" _w(1.2L)

    u"one"_w; // calls operator "" _w(u"one", 3)

    12_w; // calls operator "" _w("12")

    "two"_w; // error: no applicable literal operator
}

Ответы [ 2 ]

3 голосов
/ 04 мая 2019

Поскольку пользовательский литеральный оператор, работающий с символьной строкой , должен иметь два параметра: указатель на символы и длину (см. Раздел 3b в вашей ссылке cppreference). В примере оператора, который вы считаете нужным вызвать, отсутствует этот параметр длины.

Чтобы это работало, декларация должна быть

unsigned operator "" _w(const char*, size_t);
0 голосов
/ 04 мая 2019

Можно ли передать строковый литерал в функцию, принимающую const char *?

Да.

Пример:

void foo(const char*);
foo("two"); // works

Вы связались и цитировали документацию определяемых пользователем строковых литералов . Пользовательские строковые литералы - это отдельная вещь из строковых литералов .

, но в последней строке этого кода из cppeference для пользовательских строковых литералов этоговорит, что не существует литерального оператора для «два».

Исправление: в этом примере пользовательский строковый литерал для _w отсутствует."two" является строковым литералом."two"_w является определяемым пользователем строковым литералом, но поскольку в примере нет объявления для T operator "" _w(const char*, size_t), это ошибка.

Почему, если строковый литерал "два" может бытьпередается в функцию, принимая const char *?

Может ли "two" быть передана в функцию, принимая const char*, полностью независимо от того, был ли определен пользовательский строковый литерал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...