2009-05-30 93 views
2

我想写两个不同的函数来处理一个常量值和给定类型的变量(即int)。“F(5)”和“int x; F(x)»来调用不同的函数?

这里是例子测试用例:

int main(void) { 
     int x=12; 
     F(5); // this should print "constant" 
     F(x); // this should print "variable" 
} 

我认为这将是足够的定义:

void F(int v) { cout << "constant\n"; } 
void F(int& v) { cout << "variable\n"; } 

这假定编译器会选择int&变量为“更好的专业”和作为唯一选择的常数为int)。然而,G++这是结果:

test.cc: In function ‘int main()’: 
test.cc:13: error: call of overloaded ‘F(int&)’ is ambiguous // for line: F(x); 
test.cc:4: note: candidates are: void F(int) 
test.cc:5: note:     void F(int&) 

G++确实选择F(int)为常数,但不知道哪个功能选择变量。
有没有人有任何想法,为什么会发生这种情况?

背景:我正在用C++中的prolog-like统一方法进行实验。能够知道常量和变量之间的差异将有助于我在诸如functor(x,5) <=> functor(3,5)的情况下选择所需的统一行为(分配或比较)。

回答

16

如果你想要区分编译时间常量和非编译时间常量 - 那么你就没有机会了。这是不可能的。

但是,如果你想区分一个非常量变量和一个常量变量(以及其他所有包括文字),那么你可以用一个const引用和非const引用参数来重载一个函数。对于这种情况,C++标准引入了额外的规则,这使得这种不明确的情况不明确。

void f(int const&); // #1 
void f(int&);  // #2 

在这个问题上,特作如下决定做

int x = 0; 
int const y = x; 
int const z = 1; 

f(1); // #1 
f(x); // #2 
f(y); // #1 
f(z); // #1 

注意怎么就不能y和z区分,即使的z值是一个编译时间常数(称为整型常量表达式,或者ICE),而y不是。

可以做的只是接受编译时间值。过载功能,使一个是一个模板,另一种是不

template<int N> void f(); // #1 
void f(int n);   // #2 

它的行为是这样,那么:

int x = 0; 
int const y = x; 
int const z = 1; 

f<1>(); // #1 
f(1); // #2 
f<y>(); // error, y not an ICE 
f<z>(); // #1 
f(x); // #2 
+0

这是我需要的大概是什么。谢谢。 – liori 2009-05-30 19:10:33

相关问题