我遇到过一个函数,它可以区分被称为
foo("bar");
VS
const char *bob = "bar";
foo(bob);
我想到的可能性是:
我能想到的唯一可行的例子是:
void foo(char *msg)
{
printf("string literal");
}
void foo(const char *&msg)
{
printf("string pointer");
}
foo("bar"); // "string literal"
const char *soap = "bar";
foo(soap); // "string pointer"
我无法访问函数的代码,头文件中的声明只显示了一个函数声明。
答案 0 :(得分:5)
这是区分字符串文字和指针的另一种方法,基于字符串文字具有数组类型而不是指针类型这一事实:
#include <iostream>
void foo(char *msg)
{
std::cout << "non-const char*\n";
}
void foo(const char *&msg) // & needed, else this is preferred to the
// template function for a string literal
{
std::cout << "const char*\n";
}
template <int N>
void foo(const char (&msg)[N])
{
std::cout << "const char array reference ["<< N << "]\n";
}
int main() {
foo("bar"); // const char array reference [4]
}
但是请注意,所有这些(包括你的原始函数)都可以通过传递非字符串文字来“欺骗”:
const char *soap = 0;
foo(soap);
char *b = 0;
foo(b);
const char a[4] = {};
foo(a);
C ++中没有类型对字符串文字是唯一的。因此,您可以使用该类型来表示数组和指针之间的区别,但不能告诉字符串文字和另一个数组之间的区别。 RTTI没有用,因为RTTI仅存在于具有至少一个虚拟成员函数的类中。其他任何东西都依赖于实现:标准中不保证字符串文字将占用任何特定的内存区域,或者在程序中(或甚至在编译单元中)使用两次的相同字符串文字将具有相同的地址。就存储位置而言,实现可以对字符串文字执行的任何操作,也允许使用我的数组a
。
答案 1 :(得分:0)
如果你把它称为:
会发生什么const char bob[] = "bar";
foo(bob);
它可能正在使用某种区别来做出决定。
编辑:如果标题中只有一个函数声明,我无法想象任何可移植的方式,库可以做出这种区分。
答案 2 :(得分:0)
理论上的函数foo()
可以使用宏来确定参数是否是文字。
#define foo(X) (*#X == '"'
? foo_string_literal(X)
: foo_not_string_literal(X))