【问题标题】:«F(5)» and «int x; F(x)» to call different functions?«F(5)» 和 «int x; F(x)» 调用不同的函数?
【发布时间】:2009-05-30 18:50:04
【问题描述】:

我想编写两个不同的函数来处理一个常量值和一个给定类型的变量(即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&amp; 变量作为“更好的专业化”和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) &lt;=&gt; functor(3,5) 等情况下,能够知道常量和变量之间的区别将有助于我选择所需的统一行为(赋值或比较)。

【问题讨论】:

    标签: c++


    【解决方案1】:

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

    但是,如果您想区分非常量变量和常量变量(以及包括的所有其他内容 - 像文字),那么您可以使用 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
    

    【讨论】:

    • 这可能就是我需要的。谢谢。
    • 是的,这(f(int const&) vs. f(int&))是我真正需要的。非常感谢!
    猜你喜欢
    • 2013-01-26
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多