代码之家  ›  专栏  ›  技术社区  ›  Kiril Kirov

g++在一个*expected*错误消息中给了我一个奇怪的函数调用

  •  1
  • Kiril Kirov  · 技术社区  · 14 年前

    情况是这样的:

    void funct( unsigned u, double d, float f )
    {
            u = 12;
    }
    void funct( double u, int d, void* asd, float f )
    {
            u = 13;
    }
    
    int main()
    {
            const unsigned u = 123;
            double d = 123.123;
            float f = 123.123;
    
            funct( u, d, f, 123 );
    
            return 0;
    }
    

    给我:

    ./src/test.cpp:19: error: no matching function for call to 'funct(const unsigned int&, double&, float&, int)'
    ./src/test.cpp:4: note: candidates are: void funct(unsigned int, double, float)
    ./src/test.cpp:8: note:                 void funct(double, int, void*, float)

    这绝对是预期的错误,因为没有合适的函数可以调用,好吧。但是看看编译器错误:

                                                              V        V       V
    no matching function for call to 'funct(const unsigned int&, double&, float&, int)
    

    为什么这些 & 在那里?当我进行正确的调用时-一切都很好,并且所有参数,如预期的那样,都不会作为引用传递。

    使用 Ubuntu 10.04 ,64位和 g++ version 4.4.3

    3 回复  |  直到 14 年前
        1
  •  4
  •   Kos    14 年前

    你通过了 可赋给的实数变量 (一个“ lvalue “)函数。当然,您是按值传递的,而不是按引用传递的,但关键是,在函数调用中 会有能力 通过引用传递,因为它是 左值 .

    然后:如果您有一个类型的值 int& ( 左值 ),您可以将其发送到接受 int (或者 rvalue 左值 )-不是相反。

        2
  •  4
  •   Eugene Smith    14 年前

    编译器不知道您是想通过值还是引用传递变量。不能排除正确的函数(您未能声明的函数)需要引用的可能性。

        3
  •  0
  •   Johannes Schaub - litb    14 年前

    它试图将参数表达式映射为仅以类型表示它们。所以对于类型的左值 T ,它使用 T& ,对于类型为的值 T型 它使用 T型 (未修改)。

    当然,参数表达式从不具有引用类型(任何表达式都不能具有引用类型),但这是GCC的表达方式。对于C++0x,将有LValk、XValues和PROVALL。GCC可能会使用 T& 第一次和 T型 对于后两个,或者 T&& 第二次和 T型 最后一次。

    克朗在这里做得更好

    main1.cpp:16:9: error: no matching function for call to 'funct'
            funct( u, d, f, 123 );
            ^~~~~
    main1.cpp:5:6: note: candidate function not viable: no known conversion from 'float' to 
                         'void *' for 3rd argument                                     
    void funct( double u, int d, void* asd, float f )
         ^
    main1.cpp:1:6: note: candidate function not viable: requires 3 arguments, but 4 were provided
    void funct( unsigned u, double d, float f )
         ^
    1 error generated.