重载解析不正确,const 参数的值为 0
Incorrect overload resolution with value of const argument as 0
我有一个类B
,其中包含两个重载函数int Set(B *);
和int Set(const A&);
。类A
需要一个构造函数参数unsigned char
。当使用值为 0
的const unsigned char
调用 Set
时,它被解析为Set(B*)
而当传递的值不为零时,它会解析为 Set(const A&)
(根据我的期望)。
重载分辨率在非常量unsigned char
中预期有效,但在值设置为 0
的const unsigned char
时失败。为什么?
以下代码说明了使用 const 和非 const 调用 Set
时的差异unsigned char
#include <iostream>
using namespace std;
class A{
char m_byteValue;
public:
A(unsigned char c) {
m_byteValue = c;
}
};
class B{
int m_a;
public:
B(){
m_a = 2;
}
int Set(B *);
int Set(const A&);
};
int B::Set(const A& v) {
cout << "I am in the const ref functionn";
return 0;
}
int B::Set(B* p) {
cout << "I am in the pointer functionn";
return 0;
}
int main(){
const unsigned char a = 0;
const unsigned char b = 1;
unsigned char c = 0;
unsigned char d = 1;
B var;
var.Set(a);
var.Set(b);
var.Set(c);
var.Set(d);
return 0;
}
输出(由 gcc 4.9.2
c++98 编译):演示 - 在 ideone c++ 5.1 上
I am in the pointer function // Why?
I am in the const ref function
I am in the const ref function
I am in the const ref function
标准之间的区别在这里:
C++98 [转换]
空指针常量是计算结果为零的整数类型的整数常量表达式 rvalue。
C++11 [会议]
空指针常量是值为零或 prvalue 类型为
std::nullptr_t
的整数文本。
const unsigned char a = 0;
满足整型常量表达式的 C++98 定义。当然a
不是右值,但似乎左值到右值的转换适用,并且仍然比用户定义的从unsigned char
到A
的转换更匹配。
a
不是字面意思,这就是C++11中行为不同的原因。
Clang 重现了错误,但幸运的是在编译过程中也给了你答案:
overloading_incorrect.cxx:41:13: warning: expression which evaluates
to zero treated as a null pointer constant of type 'B *'
[-Wnon-literal-null-conversion]
var.Set(a);
^
正如 NathanOliver 在您的帖子中正确提到的那样,一旦使用 c++11 标准(将 -std=c++11
标志添加到编译器),这种行为就会消失。
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 'HMODULE LoadLibraryA(LPCSTR)':无法将参数 1 从 'const _Elem *' 转换为 'LPCSTR'
- 将函数参数"const char*"转换为"std::string_view"是
- 将参数传递为"const"的奇怪效果
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- std::span<const T> 作为函数模板中的参数
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 何时应在构造函数参数中使用 const C++?
- 不允许运算符 const 参数调用 const 成员函数
- std::p ackaged_task 应该删除带有 const 参数的复制 c'tor
- 知道模板参数在编译时是否为 const char*?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 具有参数 (const T *&) 或 (T * &) 或 (const T * const &) 或 (T * const &) 的方法
- 为什么在函数参数前面添加 const 会出错?
- 在函数中使用运算符重载,在 c++ 中使用 const 类型输入参数
- C++ Boost - 序列化错误 - 将"const B"作为"this"参数
- C++ 我应该如何解释函数参数long(*pPointer)(OtherClass *const, long)?
- 什么..表示函数内部参数(const char*值,..)
- 如果参数创建本地副本,则使用参数"const [variable_type] &"的目的是什么?
- 候选函数不可行:第一个参数('const Node *')将失去常量限定符