【问题标题】:How to call a non-const overload?如何调用非常量重载?
【发布时间】:2014-03-10 16:32:37
【问题描述】:

void func(const int& i)void func(int& i) 之间有什么区别。如果 const 在顶层被切断,是否甚至可以调用第二个重载?为什么首选 const 重载?以下将始终选择第一个重载:

func(42);
func(int{42});
int i = 42;
func(i);
int &j = i;
func(j);
func(i + 1);

哎呀,我知道我现在的问题是什么了。我在两个函数中都输入了cout << "const\n",所以看起来它总是调用第一个重载。对不起各位。

【问题讨论】:

  • 标题中的Pokemon是什么意思?!
  • @stefan,这是 OP 被困在口袋妖怪世界中的微妙暗示。
  • @chris 好的,所以我认为我们可以同意这也适用于我们的世界,我删除了它。
  • 是什么让你认为第一个重载总是会被选中?
  • 请点击旁边的复选标记接受答案而不是更改标题。

标签: c++


【解决方案1】:

const 是对您自己 和其他开发人员的提示,您不打算修改观察到的对象。如果参数是 const,则选择 const 重载:

#include <iostream>

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

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

int main()
{
    int a = 0;
    const int b = 0;
    int& c = a;
    const int& d = a;
    f(a);
    f(b);
    f(c);
    f(d);
}

这将输出

f(int&)
f(const int&)
f(int&)
f(const int&)

this demo

如您所见,它并不总是 const 过载。

【讨论】:

    【解决方案2】:

    void func(const int&amp; i)void func(int&amp; i) 之间有什么区别。

    void func(const int&amp; i)void func(int&amp; i) 之间的区别在于您不能在第一个函数中更改i,而您可以在第二个函数中更改。

    甚至可以调用第二个重载吗?

    如果参数不是const,则选择第二个函数。

    为什么首选const 重载?

    这取决于。如果您打算更改其值,则不能使用 const。当您想确保不会意外或有意更改变量时,您应该使用const。查看这篇文章:Use const wherever possible in C++? 了解更多信息。

    【讨论】:

    • 至少不合法(邪恶的笑声)。
    • 但 const 重载并不总是首选。
    • @juanchopanza 这取决于目的。如果需要更改其值,则不能使用const。更新了答案。谢谢。
    • 不取决于目的。该语言对此有规定,它们与 OP 的主张相矛盾。
    猜你喜欢
    • 2013-04-25
    • 2013-10-14
    • 1970-01-01
    • 2019-02-25
    • 2011-07-03
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    相关资源
    最近更新 更多