函数签名由函数的名称和参数类型组成。当在C++中定义多个函数具有相同的名称但不同的参数类型或参数个数时,编译器可以根据函数签名来区分它们,从而保证不会冲突,并选择正确的函数进行调用。...但 NULL 本质上是 #define NULL 0,属于整数 0,容易导致歧义。歧义如下: C++11 引入 nullptr,专门用于表示空指针,避免了 NULL 的问题。...3. nullptr 适用场景 初始化空指针 int* ptr = nullptr; // 推荐 函数重载时避免歧义 void foo(int); void foo(char*); foo(0);...; // 代替 NULL,更清晰 } 与 nullptr_t 结合使用 std::nullptr_t nptr = nullptr; // `nullptr_t` 只能存 nullptr 4....结论 ✅ C++11 及以上版本推荐使用 nullptr 代替 NULL 和 0,避免歧义,使代码更安全、可读性更强。 5.引申 语法更新的宗旨是向前兼容,旧的东西依然可用,但新版本有更好的方法替代。
运行结果如下: 由于 NULL 被定义为 0,这里会调用 int 参数的版本,而不是我们期望的指针版本,所以最后两个结果都是选择int 参数的版本。 3....C++11 引入 nullptr 的原因 为了消除 NULL 在 C++ 中的二义性问题,C++11 引入了 nullptr 作为一种新型空指针常量。...以下是一个简单的实现: const class nullptr_t { public: template operator T*() const { return 0;...总结 NULL 是一个历史遗留的宏定义,虽然在 C++ 中仍然可以使用,但它会在特定场景下引发意外的行为和错误。为了消除这些问题,C++11 引入了 nullptr,作为一种类型安全的空指针表示。...今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。 也可以点点关注,避免以后找不到我哦! Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!
重载歧义:在函数重载时,如果两个函数分别接受整数和指针类型的参数,而NULL被错误地传递给整数参数的函数,这种错误在编译时不会被捕获。...二、nullptr的特点 1.类型安全 nullptr的类型是std::nullptr_t,这是一个特殊的类型,专门用于表示空指针。...4.与智能指针的交互 nullptr可以与C++的智能指针(如std::unique_ptr、std::shared_ptr等)一起使用,用于初始化或表示智能指针不拥有任何资源的情况。...int* ptr = nullptr; 2.函数参数和返回值 在函数参数和返回值中,nullptr用于表示空指针或无结果的情况。...3.可读性 NULL:可能引起歧义,不容易分辨其具体含义。 nullptr:明确表示空指针的含义,更易于阅读和理解。
这使得在使用 nullptr 时更具有类型安全性,避免了使用整数 0 或 NULL 时可能引起的混淆和错误。 2. 消除二义性: 在 C 和 C++ 中,NULL 是一个表示空指针的宏。...模板编程: 在模板编程中,特别是在模板元编程中,使用 nullptr 可以更好地处理空指针相关的逻辑,因为它有明确的类型。在模板中,传递 nullptr 可以更好地匹配相应的模板参数。...; char* charPtr = nullptr; myTemplateFunction(intPtr); // 调用处理整数指针的版本 myTemplateFunction...(charPtr); // 调用处理非空指针的通用版本 return 0; } 6....auto myAutoPointer = nullptr; // 推导为 std::nullptr_t 类型 if (myAutoPointer == nullptr) { /
nullptr使用代码如下: int *ptr = nullptr; 同样是表示空指针,之前NULL使用的好好的,为什么要引入nullptr? nullptr和NULL又有什么区别呢?...); // char* return 0; } 另一个原因是在C++的函数重载中,传入NULL会导致编译失败,所以需要引入nullptr,使用nullptr可以解决函数重载中的参数匹配问题。...所以如果编译器支持nullptr,一定要使用nullptr。 空指针应该有什么特性吗? 1. 它应该有一个自己的名字,它应该是一个保留关键字。 2....因为它的取址操作被delete修饰了。 使用nullptr还有什么好处呢?可以用于抛出异常。...throw nullptr; } catch(nullptr_t) { ... } } 之后使用它的类型nullptr_t捕获,这里如果throw NULL,那用什么类型去
NULL是什么 在《NULL,0,'\0',"0","\0"的区别》一文中,我们已经知道了在C中NULL是什么,在C的头文件中,通常定义如下: #define NULL ((void*)0) 但是在C...那么为什么在C++和C中不一样呢?...nullptr nullptr并非整型类别,甚至也不是指针类型,但是能转换成任意指针类型。nullptr的实际类型是std:nullptr_t。...博客:https://www.yanbinghu.com/2019/08/25/36794.html 为什么该使用nullptr 回到最开始的问题,为什么作为指针的语义,我们应该使用nullptr,而不是...但是如果我们使用nullptr却不会: test(nullptr); 除了这点之外,在C++模板中它还有更好的表现。
函数参数传递 const 引用常用于函数参数传递,特别是当函数不需要修改参数的值时。这种方式可以避免不必要的拷贝,同时保证参数的值不会被意外修改。...主要特点 减少开销:避免函数调用的压栈、跳转和返回操作,提升效率。 代码膨胀:函数体被直接插入调用处,可能增加生成的可执行文件大小。...特性 nullptr (C++11) NULL (C/C++) 类型 是 std::nullptr_t 类型,可以隐式转换为任意指针类型 通常是 0 或 (void*)0,是一个宏定义 类型安全 类型安全...为什么需要 nullptr? 类型安全问题 在 C++ 中,NULL 通常被定义为 0 或 (void*)0,这可能导致类型混淆。...C++ 类型系统的改进 nullptr 是 std::nullptr_t 类型,可以隐式转换为任意指针类型,但不能转换为整数类型,增强了类型检查。
关键字nullptr是std::nullptr_t类型的值,用来指代空指针常量。...int* p1 = NULL; //或 int* p2 = nullptr; 在使用nullptr_t与nullptr时,注意以下几点: (1)可以使用nullptr_t定义空指针,但所有定义为nullptr_t...; (4)nullptr_t类型对象不能用于算术运算表达式; (5)nullptr_t类型对象可以用于关系运算表达式,但仅能与nullptr_t类型或指针类型对象进行比较,当且仅当关系运算符为==、...constexpr可以修饰函数参数、函数返回值、变量、类的构造函数、函数模板等,是一种比const更加严格的约束,它修饰的表达式除了具有“运行时常量性”,也具有“编译时常量性”,即constexpr修饰的表达式的值在编译期间可知...B3::f函数吗?
除了NULL之外,C++11新标准中又引入了nullptr来声明一个“空指针”,这样,我们就有下面三种方法来获取一个“空指针”:如下:int *p1 = NULL; // 需要引入cstdlib头文件int...到这里,大家心里有没有疑问:为什么C++11要引入nullptr?它与NULL相比又有什么不同呢?这就是我们今天要解决的问题。...那么问题又来了,我们从一开始学习C++的时候就被告诫C++是兼容C的,为什么对于NULLC++却不完全兼容C呢?通过查找维基百科,才发现这其中的原因。...nullptr关键字真是为了解决这个问题而引入的。另外我们还有注意到NULL只是一个宏定义,而nullptr是一个C++关键字。...nullptr如何使用nullptr关键字用于标识空指针,是std::nullptr_t类型的(constexpr)变量。
, 计数为0时自动delete. std::make_shared用来消除显式使用的new操作, .get()用来取得原始指针, .reset()用来消掉一个当前的引用计数, .use_count()得到目标对象的引用计数...所有不需要分享的指针都应该用这个来代替 unique_ptr还有一个默认模板参数是deleter决定析构时的动作....进行拷贝赋值, 因为这相当于reset UniquePtr& operator=(std::nullptr_t) noexcept { reset(); return *this...new (std::nothrow) std::mutex()) {} PtrBase(std::nullptr_t) noexcept : PtrBase() {} PtrBase(p_counter...& operator=(std::nullptr_t) noexcept { _destroy(*this); return *this; } // 移动构造函数, 由于是构造所以可以直接夺取指针内容
_p = nullptr; return *this; } unique_ptr& operator=(std::nullptr_t) { if(...unique_ptr(std::nullptr_t) {} explicit unique_ptr(T* t) { _p = t; } unique_ptr..._p = nullptr; return *this; } unique_ptr& operator=(std::nullptr_t) { if...而shared_ptr的尺寸是裸指针的二倍,同时还有控制块的开销,相比较unique_ptr要更占空间。实际的c++标准库也是如此,共享指针更占用资源。...shared_ptr引用计数是线程安全的,但是不保证引用对象的多线程安全,需要参数类型自行处理。
模板类型推导 模板类型推导中最重要的是弄清它什么时候会抛弃引用,什么时候会抛弃常量性 •template void func(T& param);在这个示例函数中,如果传递进是一个...([](const std::vector& _data) { /* */ }, std::move(data)); 除了“移动捕获”外,还可以利用初始化捕获来初始化Lambda表达式中所需要使用的变量...:C++中不允许void*指针隐式转换为其他指针类型,即下面代码是非法的 int* p = (void*)0; nullptr是C++11中的一个关键字,它的类型是std::nullptr_t #ifdef...__cplusplus namespace std { typedef decltype(__nullptr) nullptr_t; } using...::std::nullptr_t; #endif default和delete C++11前利用private以阻止访问成员函数,并且不给出它们的实现,如果在用户代码中仍然去访问此没有实现的成员函数,那么会在链接阶段得到错误
6.引用 1.什么是引用? 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。...指针和引用的自增(++)运算意义不一样; 8.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。 7内联函数 1什么是内联函数?...还有: void func(int); void func(char); 如果NULL被定义为0,func(NULL)会去调用void func(int),这是不合理的 所以引入...nullptr的类型为nullptr_t,能够隐式的转换为任何指针。...nullptr 与 nullptr_t: typedef decltype(nullptr) nullptr_t; 注意: 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C
显然,这玩意并没什么用,于是在C++11里,他就变成了可以自动推导的变量类型。...他出现的目的,主要是由于我们懒得写那些巨长无比的类型名,最典型的用处就是在声明迭代器的时候: std::map mp; for(std::map<double,double...用途 虽然decltype在泛型中有一些重要的用法,但是最常用的用一个类型来定义另一个类型: typedef decltype(nullptr) nullptr_t; typedef decltype(..... } for(auto i : {1,2,3,4}){ ... } 除了能循环数组,vector这类容器之外,还能迭代map等特殊容器,不过需要注意的是,对于map来说,我们获得的迭代变量是...::coutstd::endl; } } 输出结果是: 2 4 6 参考资料 auto 基于模板的参数推断 decltype 类型别名 深入应用c++11 C++FAQ
我们看一个例子: #include using std::cout; void f(int* p) { cout << "int* f\n"; } void f(int a)...我们看到,NULL作为参数的时候,实际并没有调用指针为形式参数的函数,而是调用了形式参数为int的函数。当我们使用强制转换的时候,没有什么问题。因此,这样的调用可能是违背我们的原意的。...所以C++11引入了新的指针空值nullptr。很好的解决了上面出现的违背原意的操作。C++11把nullptr作为一个关键字引入。它本身是“指针空值类型”的一个常量。...指针空值常量类型被命名为nullptr_t。...我们可以看到,它按照我们原本的意思,成功的调用了指针类型的重载函数。 但是需要注意的是nullptr的地址是不能被用户使用的。
除了shared_ptr之外,还有weak_ptr,但是weak_ptr并不拥有其所指向的对象,因此不影响该对象的销毁与否,也不能对weak_ptr解引用,只能判断该指针是否已经被销毁。...空指针nullptr的存在是为了解决NULL的二义性问题,因为NULL也可以代表0,nullptr的类型为nullptr_t,能隐式转换为任何指针或者是成员指针的类型,也能和它们进行相等或者不等的比较。...lambda的写法如下: [函数外部对象参数] (函数参数) -> 返回值类型{ 函数体} (1)[ ]中的函数外部对象参数,允许在函数体内直接调用函数外部的参数; (2)( )中的参数,同正常函数的参数没有什么差异...[&,a]除了a用传值的方式,其他变量都已引用的方式传入 6....[=,&a]除了a用引用的方式传入,其他变量都以传值的方式传入 下面让我们通过一个例子来了解一下,当在lambda中使用了“=”传入的参数,且对引用参数或者外部参数进行赋值操作之后,会产生意想不到的结果
::unique_ptr 还能保存数组,这时 std::make_unique 的参数表示数组的长度: std::unique_ptr p0 = std::make_unique<int[...// destructor // block end 比较重要的一点是 std::unique_ptr 删除了拷贝构造,所有它对对象的所有权是独享的,你没有办法直接将 std::unique_ptr...除了上面这些特性,std::unique_ptr 还提供了一些与裸指针相关的成员函数,你可以使用 get() 来直接获取裸指针: auto p = std::make_unique...接下来是 nullptr_t 的构造和 operator=: template = 0> constexpr...unique_ptr(nullptr_t) noexcept : _Mypair(_Zero_then_variadic_args_t{}) {} unique_ptr& operator=(nullptr_t
A或者B中间的某一个变量声明为std::weak_ptr,如果两者都声明为std::weak_ptr会有什么问题?...的第一个参数也为空。...接着看_M_dispose()定义: template inline void _Sp_counted_ptrnullptr_t, _S_single>::_M_dispose()...{ } template inline void _Sp_counted_ptrnullptr_t, _S_atomic>::_M_dispose() noexcept {...} 因为传入的指针为nullptr,因此调用了_Sp_counted_ptr的特化版本,因此_M_dispose()这个函数什么都没做。
*)0); using nullptr_t = decltype(nullptr); vectorvec; typedef decltype(vec.begin()) vectype; for...关键字nullptr是std::nullptr_t类型的值,用来指代空指针。...B3::f函数吗?...而标记为final的类,例如上面的 B1,编译器则根本不会生成虚表。这样的代码显然更有效率。 7.sizeof…运算符 sizeof…运算符的作用是获取C++11中可变参数模板中参数包中元素个数。...在 C++11 中,被称为 “特殊成员函数” 的还有两个:移动构造函数和移动赋值运算符函数。如果用户申明了上面六种函数,编译器则不会隐式产生。
因为Bert模型除了分类,还能执行其他任务。...它还有其他的设置,这里不展开。我们只需要实现一个最简单代码即可。Ort::Value的构建Ort::Value是模型输入的类型,也就是ORT C++ API中表示Tensor(张量)的类型。...Ort::Session时的临时变量,这里为什么要弄成Model类的成员变量呢?...::nullptr_t) {}...::nullptr_t) {} ///< Create an empty Session object
领取专属 10元无门槛券
手把手带您无忧上云