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]
,没有办法。你为什么要区分它们?是的,我想区分常量和常量:(