【问题标题】:const T*& and const T* do not produce ambiguity on function overloadconst T*& 和 const T* 不会在函数重载时产生歧义
【发布时间】:2016-10-21 15:44:55
【问题描述】:
  • 为什么以下示例代码不会产生歧义
  • 有没有办法调用第二个版本? (如果这不是错误)

#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

【问题讨论】:

    标签: c++ pointers reference overloading overload-resolution


    【解决方案1】:
    • 为什么以下示例代码不会产生歧义

    这不是错误。参数的类型是const int*&amp;,它是对非常量的引用,不能绑定到不同类型的对象(int*)。 (需要隐式转换,生成的临时变量不能绑定到非常量的引用。)

    如果将参数的类型更改为对 const 的引用:

    void foo(const int* const&)
    

    或者将参数的类型改为const int*

    const int* i=nullptr;
    foo(i);
    

    两者都会因不明确的调用而触发编译错误。

    • 有没有办法调用第二个版本? (如果这不是错误)

    你可以通过一个函数指针来实现,明确指定你要选择哪一个:

    const int* i=nullptr;
    static_cast<void(*)(const int*&)>(&foo)(i);
    

    【讨论】:

    • 哦,你是对的。顺便说一句,我可以调用第二个版本吗?
    • 你能告诉我为什么非指针类型会产生歧义吗?
    • @appleapple 查看我编辑的答案。你说的“非指针类型”是什么意思?
    • 现在我想也许我的问题是为什么 T* 不能转换为 const T*&amp;
    • @appleapple 很高兴可以提供帮助。好吧,关于为什么T* 不能绑定到const T*&amp;,但可以绑定const T* const&amp;,我试图在第一段中解释。如果不够清楚,请告诉我。并且引用与指针的行为不同,它们不是一回事。
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多