const T*& 和 const T* 不会在函数重载时产生歧义
const T*& and const T* do not produce ambiguity on function overload
- 为什么下面的示例代码不会产生歧义
- 有没有办法调用第二个版本? (如果这不是错误)
#include <iostream>
using namespace std;
void foo(const int*){cout << "no ref";}
void foo(const int*&){cout << "on ref";}
int main()
{
int* i=nullptr;
foo(i);
}
编辑:
这个
#include <iostream>
using namespace std;
void foo(const int){cout << "no ref";}
void foo(const int&){cout << "on ref";}
int main()
{
int i=0;
foo(i);
}
确实会产生歧义。
顺便说一下,消除const产生的歧义。
编译器:带有标志的 g++5.3.0 --std=c++14
- Why the following sample code do not produce ambiguity
这不是错误。参数的类型是const int*&
,它是对非常量的引用,不能绑定到不同类型的对象(int*
)。 (需要隐式转换,并且生成的临时对象不能绑定到对非常量的引用。)
如果将参数的类型更改为对 const 的引用:
void foo(const int* const&)
或将参数类型更改为 const int*
:
const int* i=nullptr;
foo(i);
两者都将触发歧义调用的编译错误。
- Is there any way to call the second version? (If this is not a bug)
您可以通过一个函数指针来完成,明确指定您要选择哪一个:
const int* i=nullptr;
static_cast<void(*)(const int*&)>(&foo)(i);
- 为什么下面的示例代码不会产生歧义
- 有没有办法调用第二个版本? (如果这不是错误)
#include <iostream>
using namespace std;
void foo(const int*){cout << "no ref";}
void foo(const int*&){cout << "on ref";}
int main()
{
int* i=nullptr;
foo(i);
}
编辑:
这个
#include <iostream>
using namespace std;
void foo(const int){cout << "no ref";}
void foo(const int&){cout << "on ref";}
int main()
{
int i=0;
foo(i);
}
确实会产生歧义。
顺便说一下,消除const产生的歧义。
编译器:带有标志的 g++5.3.0 --std=c++14
- Why the following sample code do not produce ambiguity
这不是错误。参数的类型是const int*&
,它是对非常量的引用,不能绑定到不同类型的对象(int*
)。 (需要隐式转换,并且生成的临时对象不能绑定到对非常量的引用。)
如果将参数的类型更改为对 const 的引用:
void foo(const int* const&)
或将参数类型更改为 const int*
:
const int* i=nullptr;
foo(i);
两者都将触发歧义调用的编译错误。
- Is there any way to call the second version? (If this is not a bug)
您可以通过一个函数指针来完成,明确指定您要选择哪一个:
const int* i=nullptr;
static_cast<void(*)(const int*&)>(&foo)(i);