zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

C++转换 无法 禁止 int 隐式
2023-06-13 09:14:59 时间

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.cn/183127.html原文链接:https://javaforall.cn