C++ c++;“之间的过载”;str";和常量字符[N]?

C++ c++;“之间的过载”;str";和常量字符[N]?,c++,c++11,C++,C++11,这类电话是否可能超载 f("st");//variant 1 struct Foo { char buf[3]; Foo() { strcpy(buf, "aa"); } }; const Foo foo; f(foo.buf);//variant 2 在这两种情况下,typeid给出相同的类型, 是区分上述f的两个调用的任何变体, 并且有两种不同的f?我尝试了std::is\u rvalue\u reference,但没有成功 如果类型为Foo的对象不是const对象,则可以使用 templ

这类电话是否可能超载

f("st");//variant 1
struct Foo { char buf[3]; Foo() { strcpy(buf, "aa"); } };
const Foo foo;
f(foo.buf);//variant 2
在这两种情况下,
typeid
给出相同的类型, 是区分上述
f
的两个调用的任何变体,
并且有两种不同的
f
?我尝试了
std::is\u rvalue\u reference
,但没有成功

如果类型为
Foo
的对象不是const对象,则可以使用

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;
}
模板
空f(常量字符(&a)[N])
{
标准::cout建立在
还值得讨论为什么检查字符串右值引用(std::is\u右值\u引用)不起作用

我尝试了std::is\u右值参考,但没有成功

这是因为字符串文字实际上是左值,如5.1.1.1所述

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


这是不可能的,因为
foo.buf
“st”
具有相同的类型:
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;
}
structfoo{
std::阵列buf;
};
模板
空f(常量字符(&a)[N])
{

std::cout
“st”
const char[N]
类型。字符串文本是
const char[N]
,它不同于
char[N]
@N.m.
foo
也可能是
const
修改的。我怀疑有什么方法可以做到这一点。如果两者都是
const char[N]
,没有办法。你为什么要区分它们?是的,我想区分常量和常量:(