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

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

Я читал в других местах, где передача строкового литерала в качестве 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
}

person Colin Hicks    schedule 04.05.2019    source источник


Ответы (2)


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

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

unsigned operator "" _w(const char*, size_t);
person 1201ProgramAlarm    schedule 04.05.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*, полностью не зависит от того, определили ли вы определяемый пользователем строковый литерал.

person eerorika    schedule 04.05.2019