是否可以将字符串文字传递给采用const char *的函数?

时间:2019-05-04 01:09:54

标签: c++ type-conversion implicit-conversion user-defined-literals

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

我已经读过other places,认为将字符串文字传递为const char*是合法的。但是,在this code from 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 个答案:

答案 0 :(得分:3)

因为对字符串起作用的用户定义文字运算符必须具有两个参数:指向字符的指针和长度(请参见cppreference链接中的3b部分) 。您认为应该调用的示例运算符缺少此length参数。

要使其正常工作,声明应为

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

答案 1 :(得分:0)

  

是否可以将字符串文字传递给采用const char *的函数?

是的

一个例子:

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

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

  

但是在cppeference的这段代码的最后一行中,对于用户定义的字符串文字,它表示没有用于“ two”的文字运算符。

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

  

为什么可以将字符串文字“ two”传递给采用const char *的函数?

是否可以将"two"传递到接受const char*的函数中,这与您是否已定义用户定义的字符串文字完全不同。