为什么 `int* Get()` 被称为 `const int& Get()`?
Why is the `int* Get()` called insted of `const int& Get()`?
我有一个 class B
有两个方法,其中一个 return 是指向成员变量的指针,另一个 return 是对变量的 const 引用.
我尝试调用那些方法。在通话期间,我将 return 值存储到相应的 return 类型。
我原以为适当的 return 类型最终会调用适当的方法,但我收到一个编译错误:
error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive]
const int& refval2 = b.Get(); `
这是我的代码:
#include <iostream>
class B{
public:
int* Get(){
return &x_;
}
const int & Get() const{
return x_;
}
private:
int x_ = 0;
};
int main(){
B b;
const int& refval2 = b.Get();
int* pval2 = b.Get();
}
Return type is not part of function signature, it's not considered in overload resolution。
In general, the candidate function whose parameters match the arguments most closely is the one that is called.
对于非静态成员函数调用,也涉及到被调用对象的类型。有两个 Get()
,一个是常量,一个是非常量。对于b.Get();
,非const Get()
是精确匹配;要调用 const Get()
,对象 b
必须转换为 const
。然后非 const 获胜,之后编译器将尝试将返回的 int*
转换为 const int&
并失败。
所以
B b;
int* pval2 = b.Get(); // call to non-const Get()
const B cb;
const int& refval2 = cb.Get(); // call to const Get()
问题是编译器认为这两个 Get() 函数是一样的。如果您创建两个相同的函数,但只有不同的 return 类型,编译器就不知道您要使用哪个函数。要解决此问题,请更改一个或两个 Get() 函数的名称;说 GetXPtr() 和 GetX()。
Why is the int* Get()
called insted of const int& Get()
?
const int & Get() const
是一个const
成员函数。
来自 class.this:
If the member function is declared const
, the type of this
is const X*
但是,您声明:
B b;
as non-const
将调用非 const
函数 int* Get()
。因此,错误。
正如已经回答的那样 return 不考虑类型。所以我看到了 3 种可能的解决方案:
1 使其成为函数签名的一部分:
class B {
public:
void Get( int *&refptr );
void Get( int &refval ) const;
};
int main(){
B b;
int refval2 = 0;
b.Get( refval2 );
int* pval2 = nullptr;
b.Get( pval2 );
}
但这会产生非常丑陋的代码,所以你最好使用方法 2 或 3 -
2 使用不同的函数名,这是很明显的
3 使用被忽略的参数:
class B {
public:
int *Get( nullptr_t );
const int &Get() const;
};
int main(){
B b;
const int &refval2 = b.Get();
int* pval2 = b.Get( nullptr );
}
有两件事
- return 类型在重载决策中不被考虑
- 方法的常量性在过载解析中被考虑
如果在第二种方法中删除 const,编译器会抱怨歧义。
我有一个 class B
有两个方法,其中一个 return 是指向成员变量的指针,另一个 return 是对变量的 const 引用.
我尝试调用那些方法。在通话期间,我将 return 值存储到相应的 return 类型。
我原以为适当的 return 类型最终会调用适当的方法,但我收到一个编译错误:
error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive] const int& refval2 = b.Get(); `
这是我的代码:
#include <iostream>
class B{
public:
int* Get(){
return &x_;
}
const int & Get() const{
return x_;
}
private:
int x_ = 0;
};
int main(){
B b;
const int& refval2 = b.Get();
int* pval2 = b.Get();
}
Return type is not part of function signature, it's not considered in overload resolution。
In general, the candidate function whose parameters match the arguments most closely is the one that is called.
对于非静态成员函数调用,也涉及到被调用对象的类型。有两个 Get()
,一个是常量,一个是非常量。对于b.Get();
,非const Get()
是精确匹配;要调用 const Get()
,对象 b
必须转换为 const
。然后非 const 获胜,之后编译器将尝试将返回的 int*
转换为 const int&
并失败。
所以
B b;
int* pval2 = b.Get(); // call to non-const Get()
const B cb;
const int& refval2 = cb.Get(); // call to const Get()
问题是编译器认为这两个 Get() 函数是一样的。如果您创建两个相同的函数,但只有不同的 return 类型,编译器就不知道您要使用哪个函数。要解决此问题,请更改一个或两个 Get() 函数的名称;说 GetXPtr() 和 GetX()。
Why is the
int* Get()
called insted ofconst int& Get()
?
const int & Get() const
是一个const
成员函数。
来自 class.this:
If the member function is declared
const
, the type ofthis
isconst X*
但是,您声明:
B b;
as non-const
将调用非 const
函数 int* Get()
。因此,错误。
正如已经回答的那样 return 不考虑类型。所以我看到了 3 种可能的解决方案:
1 使其成为函数签名的一部分:
class B {
public:
void Get( int *&refptr );
void Get( int &refval ) const;
};
int main(){
B b;
int refval2 = 0;
b.Get( refval2 );
int* pval2 = nullptr;
b.Get( pval2 );
}
但这会产生非常丑陋的代码,所以你最好使用方法 2 或 3 -
2 使用不同的函数名,这是很明显的
3 使用被忽略的参数:
class B {
public:
int *Get( nullptr_t );
const int &Get() const;
};
int main(){
B b;
const int &refval2 = b.Get();
int* pval2 = b.Get( nullptr );
}
有两件事
- return 类型在重载决策中不被考虑
- 方法的常量性在过载解析中被考虑
如果在第二种方法中删除 const,编译器会抱怨歧义。