C++ 是否可以重载一个函数,使其参数分别接受文字和引用?

C++ Is it possible to overload a function so that its argument accept literal and reference respectively?

我在使用 C++ 重载时遇到问题,想知道是否有人可以提供帮助。

我正在尝试重载函数,以便其参数分别接受引用和文字。

比如我想重载func1func2func:

int func1 (int literal); 
int func2 (int &reference);

我想在这种情况下使用 func

func(3);   // call func1
int val = 3;
func(val); // I want func2 to be called, but ambiguous error

有什么方法可以重载这些函数吗?

谢谢!任何帮助,将不胜感激! 抱歉英语不好。

文字和临时值只能作为 const 引用传递,而命名值将更喜欢 non-const 引用(如果可用)。您可以将其与 &&& 一起使用来创建 2 个重载。

有关原因和更多详细信息,请阅读 rvalues, lvalues, xvalues, glvalues and prvalues

下面的代码显示了最常见的情况下将使用哪个函数重载,前 2 个是您询问的:

#include <iostream>

void foo1(int &) { std::cout << "int &\n"; }
void foo1(const int &) { std::cout << "const int &\n"; }

void foo2(int &) { std::cout << "int &\n"; }
void foo2(const int &) { std::cout << "const int &\n"; }
void foo2(int &&) { std::cout << "int &&\n"; }
void foo2(const int &&) { std::cout << "const int &&\n"; }

int bla() { return 1; }

int main() {
    int x{}, y{};
    std::cout << "foo1:\n";
    foo1(1);
    foo1(x);
    foo1(std::move(x));
    foo1(bla());
    std::cout << "\nfoo2:\n";
    foo2(1);
    foo2(y);
    foo2(std::move(y));
    foo2(bla());
}

输出:

foo1:
const int &
int &
const int &
const int &

foo2:
int &&
int &
int &&
int &&