gpt4 book ai didi

c++ - 为什么非 const 方法隐藏 const 重载?

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:54 25 4
gpt4 key购买 nike

给定以下代码:

class A
{
public:
A(): value( 0 ) {}

int* get()
{
return &value;
}

const int& get() const
{
return value;
}

private:
int value;
};

int main()
{
A a;
const int& ref_value = a.get();
}

导致以下编译错误:

prog.cpp: In function 'int main()':
prog.cpp:23:35: error: invalid conversion from 'int*' to 'int'
const int& ref_value = a.get();
^

似乎带有 const 修饰符的重载 get() 方法确实被完全忽略了,编译器只看到它的非 const 定义。这是可以理解的,因为 a 对象不是常量。一种解决方案是使 a 对象保持不变。尽管还有其他两种使代码可编译的解决方案:

  1. 通过不同的名称或添加的其他参数更改 const get() 方法的签名。

    int* get();
    const int& get_changed() const; <-- this gets called
  2. 更改非 const get() 方法以返回引用而不是指针。

    int& get(); <-- this gets called
    const int& get() const;

虽然有

int* get();
const int& get() const;

我们有一个编译器错误。

令我困惑的是所有这些行为背后的原因。

最佳答案

当您同时拥有具有相同参数的同一函数的 const 和非 const 重载时,调用哪一个取决于关于调用函数的对象的 const 性。因此调用非 const a 必须调用非 const 重载。

和这个完全一样的情况:

void foo(int *p);

void foo(const int *p);


int main()
{
int i;
const int ci;
foo(&i); // Calls the first overload
foo(&ci); // Calls the second overload
}

const 限定的函数可以在非const 限定的对象上调用,但这需要“非常量到常量”转换。如果有一个重载不需要这样的转换(是更好的匹配),它将是首选。

关于c++ - 为什么非 const 方法隐藏 const 重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28878945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com