C++ 是否可以重载一个函数,使其参数分别接受文字和引用?
C++ Is it possible to overload a function so that its argument accept literal and reference respectively?
我在使用 C++ 重载时遇到问题,想知道是否有人可以提供帮助。
我正在尝试重载函数,以便其参数分别接受引用和文字。
比如我想重载func1
和func2
到func
:
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 &&
我在使用 C++ 重载时遇到问题,想知道是否有人可以提供帮助。
我正在尝试重载函数,以便其参数分别接受引用和文字。
比如我想重载func1
和func2
到func
:
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 &&