gpt4 book ai didi

c++ - «F(5)» 和 «int x; F(x)» 来调用不同的函数?

转载 作者:太空狗 更新时间:2023-10-29 23:26:09 25 4
gpt4 key购买 nike

我想编写两个不同的函数来处理一个常量值和一个给定类型的变量(即 int)。

这是示例测试用例:

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 的统一方法。能够知道常量和变量之间的区别将帮助我在诸如 functor(x,5) <=> functor(3,5) 的情况下选择所需的统一行为(赋值或比较)。 .

最佳答案

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

但是如果你想区分一个非常量变量和一个常量变量(以及包括的所有其他东西——比如文字),那么你可以用一个常量引用和非常量引用参数重载一个函数。对于这种情况,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

关于c++ - «F(5)» 和 «int x; F(x)» 来调用不同的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/930323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com