"str" 和常量字符之间的 c++ 重载[N]?

c++ overload between "str" and const char[N]?

本文关键字:重载 c++ str 常量 字符 之间      更新时间:2023-10-16

有可能重载这样的调用吗?

f("st");//variant 1
struct Foo { char buf[3]; Foo() { strcpy(buf, "aa"); } };
const Foo foo;
f(foo.buf);//variant 2

在两种情况下CCD_ 1给出相同的类型,是区分上述CCD_ 2的两个呼叫的任何变体,并且具有CCD_ 3的两种变体?我尝试了std::is_rvalue_reference,但没有成功。

如果类型为Foo的对象不是常量对象,则可以使用类似的东西

template<size_t N>
void f(const char(&a)[N])
{
   std::cout << "const char[] version" << std::endl;
}
template<size_t N>
void f(char(&a)[N])
{
   std::cout << "char[] version" << std::endl;
}

但如果对象是const,那么bufstring-literal具有等效的类型(diff只能在符号计数中,即N(,并且您无法区分它们。

字符串文字是一系列字符(如2.14.3中所定义(用双引号包围

还引用了普通字符串文字和UTF-8字符串文字到作为窄字符串文字。窄字符串文字的类型为"array"of n const char",其中n是如下定义的字符串的大小,并且具有静态存储持续时间(3.7(

基于ForEveR的答案同样值得讨论的是,为什么检查字符串右值引用(std::is_rvalue_reference(在中不起作用

我尝试std::is_rvalue_reference,但没有成功。

这是因为字符串文字实际上是5.1.1.1 中规定的lvalue

文字是主要的表达方式。它的类型取决于它的形式(2.13(。字符串文字是一个左值;所有其他文字是prvalue。

这是不可能的,因为foo.buftypeid0都有相同的类型:const char[3]

但是,如果更改buf类型,则可以区分它们。这可能是一个实用的解决方案。

struct Foo {
    std::array<char, 3> buf;
};
template<size_t N>
void f(const char(&a)[N])
{
   std::cout << "const char[N] version" << std::endl;
}
template<size_t N>
void f(const std::array<char, N>&)
{
   std::cout << "const std::array[N] version" << std::endl;
}