首页 > 编程语言 >【C++】禁止隐式转换

【C++】禁止隐式转换

时间:2024-03-19 20:56:44浏览次数:27  
标签:禁止 转换 int void C++ 调用 隐式

默认转换

考虑如下代码

void f(int a){}

以下调用都是合法的:

int main(void)
{

   f(1);    // 调用1
   f(2.f);  // 调用2
   f('c');  // 调用3
   f(1ul);  // 调用4

   return 0;
}

合法的原因是C++的隐式自动转换,甚至支持的类也可以自动转换,比如如下Test类,也可以作为f的参数

class Test {
public:
    operator int() const
    {
        return 0;
    }
};

禁用隐式转换

如果有时我们希望禁用隐式自动转换,有两种方式

方式一:

void f(int a){}
template<typename T> void f(T) = delete;

方式二:

void f(int a){}
void f(auto) = delete;

这样,只有调用1才可以正常编译通过,调用2、调用3、调用4都会编译出错,
以达到提前控制编码错误的目的。
不过,需要注意的是第二种方法需要c++14以上才支持

标签:禁止,转换,int,void,C++,调用,隐式
From: https://www.cnblogs.com/celticzy/p/18083891

相关文章

  • c++重载运算符
    定义点类(Point),用以表示几何学点的概念,有属性x、y表示坐标,并重载"-"单目运算符和"=="双目运算符,要求"-"实现对象的成员变量的数值符号取反,而"=="实现判断两个Point类的对象坐标是否相同。#include<iostream>usingnamespacestd;classPoint{ intx,y;public:......
  • Go语言的隐式契约:探索接口无声的实现
    在讨论Go语言的特性时,我们常常会提到一个独特之处:Go语言中并没有显式的implement关键字用于表明一个类型实现了某个接口。这一点与许多其他面向对象编程语言形成了鲜明对比,比如Java或C#中,实现接口需要明确声明。然而,Go语言采取了一种更加隐式的方式来处理接口和类型之间的关......
  • C++ new&malloc
    1.申请的内存所在位置new操作符从自由存储区(freestore)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operatornew的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator......
  • C++ 返回值优化
    1.函数返回机制函数返回值的传递分为两种情况:当返回的对象大小不超过8字节时,通过寄存器(eaxedx)返回。当返回的对象大小大于8字节时,通过栈返回。此处需要注意的时候,如果返回的是struct或者class对象,即使其大小不大于8字节,也是通过栈返回的。在通过栈返回的时候,栈上会有一块......
  • C++ volatile
    1.volatile关键字C++中的volatile关键字和const对应,用来修饰变量,通常用于建立语言级别的memorybarrie。volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访......
  • C++ static
    1.隐藏(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。如果加了static,就会对其它源文件隐藏。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,sta......
  • C++高级面试题:解释 C++ 中的函数对象适配器
    解释C++中的函数对象适配器函数对象适配器是C++中的一种编程技术,用于修改或增强现有的函数对象的行为。它们通常通过组合或包装现有的函数对象来实现所需的功能。函数对象适配器允许我们在不修改原始函数对象的情况下,对其进行修改或扩展。这样可以实现代码的重用和可......
  • C++ static和const
    const定义的常量在超出其作用域之后其空间会被释放;static定义的静态常量在函数执行后不会释放其存储空间;1.staticstatic表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员......
  • const,static深度总结——c++穿透式分析
         前言;c++类和对象的知识点中除了几种默认函数,比较重要的还有使用const和static修饰成员相关知识点。const在c++中特性很简单。但是在使用中,比较容易疏忽大意出现问题。static特性也很简单,但是比起const来要直接的多。在使用中只要熟练语法以及底层原理。就......
  • C++ memcpy、memmove
    函数原型:void*memcpy(void*dest,constvoid*src,size_tcount);void*memmove(void*dest,constvoid*src,size_tcount);memcpy和memmove相同点:都是用于从src拷贝count个字节到destmemcpy和memmove区别:如果目标区域和源区域有重叠的话:memcpy不能够确保源......