g ++ дает мне странный вызов функции в * ожидаемом * сообщении об ошибке - PullRequest
1 голос
/ 13 ноября 2010

Вот ситуация:

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, 64bit и g++ version 4.4.3

Ответы [ 3 ]

4 голосов
/ 13 ноября 2010

Компилятор не знает, собираетесь ли вы передавать переменные по значению или по ссылке.Это не может исключить вероятность того, что правильная функция (которую вы не смогли объявить) ожидает ссылки.

4 голосов
/ 13 ноября 2010

Вы передаете действительную переменную , которую можно присвоить функции ("lvalue"). Конечно, вы передаете его по значению, а не по ссылке - но суть в том, что при вызове вашей функции вы сможете также передать его по ссылке, потому что это lvalue.

Тогда: если у вас есть значение типа int& (lvalue), вы можете отправить его в функцию, которая принимает int (либо rvalue или lvalue) - но не другое наоборот.

0 голосов
/ 14 ноября 2010

Он пытается отобразить выражения аргумента, чтобы выразить их только в терминах типов. Таким образом, для значений типа T он использует T&, а для значений типа T он использует T (без изменений).

Конечно, выражение аргумента никогда не имеет ссылочного типа (никакое выражение не может иметь ссылочный тип), но это способ выражения этого в GCC. Для C ++ 0x будут lvalues, xvalues ​​и prvalues. GCC, вероятно, будет использовать T& для первого и T для последних двух, или T&& для второго и T для последнего.

Clang работает лучше здесь

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.
...