2017-01-10 2 views
3

В следующем коде я определяю две перегрузки, один принимающие целое число, а другая ссылку на целое ...Выбор перегрузка референтного приема функция

#include <stdio.h> 

void foo(int) { printf("foo(int)\n"); } 
void foo(int&) { printf("foo(int&)\n"); } 

Тогда я пытаюсь позвонить два перегруженных

int main(int argc, const char *argv[]) { 
    foo(3);  // Calls foo(int) 
    int x = 3; 
    foo(x);  // <--- compilation error (ambiguous overload) 
    int& y = x; 
    foo(y);  // <--- still ambiguous 
    return 0; 
} 

... как можно выбрать вопрос перегрузки int&?

Если это невозможно назвать, какой смысл его компилировать?

+3

'static_cast (foo) (x);' –

+2

Возможно, не прямой обман, так как вы также спрашиваете, почему, но сильно [связанный] (http://stackoverflow.com/ вопросы/1336 8474/ambiguous-call-to-overloaded-function-int-and-int) – George

+1

Зачем добавлять сложность в грамматику, требуя диагностики просто для существования перегрузок? Это все еще две допустимые перегрузки. Проблема заключается в сайте вызова (с его помощью). – StoryTeller

ответ

3

как можно выбрать перегруз int&?

Используя функцию указателя:

using fptr = void (*)(int&); 
fptr f = foo; 
int i; 
f(i); 

А для тех, кто блуждает здесь, ищет способ перегружать lvalues ​​и rvalues ​​здраво, решение заключается в использовании RValue ссылки:

void foo(int&&) { printf("foo(int&&)\n"); } 
void foo(int&) { printf("foo(int&)\n"); } 
Смежные вопросы