字符串文字可以传递给接受常量字符*的函数吗?

Can a string literal be passed to a function that takes const char*?

本文关键字:字符 常量 函数 文字 字符串      更新时间:2023-10-16

我需要帮助理解一些代码。

我在其他地方读到,将字符串文本作为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
}

因为处理字符串的用户定义文本运算符必须有两个参数:指向字符的指针和长度(请参阅 cpp首选项链接中的第3b节)。 您认为应该调用的示例运算符缺少此长度参数。

为了使它起作用,声明应该是

unsigned operator "" _w(const char*, size_t);

字符串文字可以传递给接受 const char* 的函数吗?

是的。

举个例子:

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

您已链接到并引用了用户定义的字符串文本的文档。用户定义的字符串文本与字符串文本是分开的。

但是在 CPPEFERENCE 针对用户定义的字符串文字的这段代码的最后一行中,它说"two"没有文字运算符。

更正:示例中没有用户定义的字符串文本_w"two"是字符串文本。"two"_w是用户定义的字符串文本,但由于示例中没有T operator "" _w(const char*, size_t)声明,因此这是一个错误。

如果字符串文字"二"可以传递给接受 const char* 的函数,为什么会这样?

"two"是否可以传递到函数中,const char*与是否定义了用户定义的字符串文本完全不同。