c++禁止隐式转换_无法将int隐式转换为类

c++禁止隐式转换_无法将int隐式转换为类C++有一个很方便的功能—隐式转换,比如有一个函数voidfunc(doublef);调用它的时候func(5);func(5.0);都是有效的。但有时候,这个功能就很麻烦了。比如:classA{public:A(conststring&v){///…}}void…


Jetbrains全系列IDE稳定放心使用

C++有一个很方便的功能—隐式转换,比如有一个函数

void func(double f);

调用它的时候

func(5);
func(5.0);

都是有效的。

但有时候,这个功能就很麻烦了。比如:

class A{
    public:
        A(const string&v){
            ///...
        }
}
void func(const std::string& v);
void func(const A& v);

编译的时候就会出现错误,因为std::string可以隐式转换为类A对象。

那么如何阻止它呢?
C++ 标准有一条规定: “Implicit conversions will be performed […] if the parameter type contains no template-parameters that participate in template argument deduction” (ISO/IEC 14882:1998, section 14.8.1.4).
也就是说,既在模板参数列表中,又在函数参数列表中的类型不会隐式转换。也就是:

template<typename T> func(const T& t, double v);
///参数t不能隐式转换,参数v可以隐式转换

那么就可以如下写代码:

//.h
template<typename T> void func(const T&);

template<> dll_export void func<std::string>(const std::string& v);
template<> dll_export void func<A>(const A& v);
//.cpp
template<> dll_export void func<char*>(const char* s)
{
///...
}
template<> dll_export void func<A>(const A& v)
{
///...
}

这么写就可避免隐式转换了。

另外,c++11标准还添加一些相关内容,十分有用。
比如只想让这个func函数只接受int型的参数,就这么写。

void function(int); // 先声明int型的参数

template <class T>
void function(T) = delete; // C++11 ,禁止生成其他参数的func函数

c++选择函数时优先考虑满足条件的非模板函数,然后才是符合条件的模板函数。在上段代码中,非模板函数function会被优先考虑,而模板function函数被删除,所以不能被调用。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183127.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • wifi数据包解析_详细解析WiFi模块的基础知识「建议收藏」

    wifi数据包解析_详细解析WiFi模块的基础知识「建议收藏」1、WiFi模块的SDK是什么?SDK是WiFi模块的软件开发工具包(全称:SoftwareDevelopmentKit)的英文简称,一般都是一些软件工程师为特定的软件包、软件框架,硬件平台,操作系统等建立应用软件时的开发工具的集合。2、WiFi模块的驱动是什么?驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂…

    2022年7月21日
  • XAML的基本语法_英语语法指南与实践

    XAML的基本语法_英语语法指南与实践我们介绍了XAML语法规则,以及用于描述XAML语法中存在的限制或选项的术语。当出现以下情况时你会发现本主题很有用不熟悉XAML语言的使用,希望加强对术语或某些语法部分的理解,或者对XAML语言的工作原理感兴趣,因而希望了解更多背景知识。…

    2022年10月28日
  • 什么是android原生系统版本,定制安卓和原生Android到底有哪些不同之处?彻底真相了…

    什么是android原生系统版本,定制安卓和原生Android到底有哪些不同之处?彻底真相了…相信大家都知道最近在搞机圈有个大新闻,就是小米即将于8月份推出MIUI9。近日小米MIUI市场副总监@黄龙中就在微博上征求米粉意见,暗示MIUI9可能长下面这样。小米最新官方主题《几何》,浓浓flyme风自2010年MIUI横空出世,国产定制安卓ROM在国内掀起了一阵风暴。MIUI成功后,乐蛙、点心等三方定制ROM迅速崛起,但随着手机系统生态逐渐稳定、刷机需求降低,定制安卓系统的范围逐渐缩小…

    2022年6月19日
  • 表空间的状态(二) – read/write

    表空间的状态(二) – read/write

    2022年1月22日
  • 把表单上的数据清除就可以了

    把表单上的数据清除就可以了

    2021年10月20日
  • 易语言跳出循环 c,易语言教程循环控制(到循环尾和跳出循环)[通俗易懂]

    易语言跳出循环 c,易语言教程循环控制(到循环尾和跳出循环)[通俗易懂]到循环尾()和跳出循环()是易语言对循环的两种控制方式,教程分别了举例师范讲解。一、官方源码到循环尾调用格式:〈无返回值〉到循环尾()-系统核心支持库->流程控制英文名称:continue本命令转移当前程序执行位置到当前所处循环体的循环尾语句处。本命令为初级命令。操作系统需求:Windows、Linux、Unix跳出循环调用格式:〈无返回值〉跳出循环()-系统核心支持库…

    2022年7月13日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号