首页
学习
活动
专区
圈层
工具
发布

Rust竟然没有异常处理?

这里的“意外”可以理解成一种语义上的“软意外”——即不能出错,区别于非法字符、找不到文件、连接不上等”硬意外“。 2 情理中的意外,可恢复。...0 正常,以返回值的形式。 相当于压缩了上一节中的0、1、2项。没有什么情理中的意外,网络连不上、文件找不到、非法输入,统统都用返回值的方式。 1 致命错误,不可恢复,非崩不可。...use std::io::prelude::*; use std::thread; use std::time; use std::fs::OpenOptions; ​ fn main() -> std...Rust的返回值Result 前面提到了,对于可恢复的错误,Rust一律使用返回值来进行检查,而且提倡采用内置枚举Result,还在实践层面给了一定的约束:对于返回值为Result类型的函数,调用方如果没有进行接收...T替换成了std::fs::File,把E替换成了std::io::Error。

2K30

const的正确姿势:从变量、函数到成员函数

正确地使用 const 可以避免意外的修改,使代码更安全;它可以作为文档,提高代码可读性;并且它能为编译器提供更多的优化机会。本文将深入探讨 const 在不同语境下的含义、细微差别和最佳实践。1....这可以防止你或你的同事在后面意外地修改它。指针:const 的“绕口令”指针涉及两个对象:指针本身和它所指向的数据。const 的位置决定了谁是不可变的。...函数中的 const:参数与返回值const 参数将函数参数声明为指向 const 或 const 引用,是常量正确性的最重要应用之一。...const 返回值返回 const 值通常用于自定义类型,以防止返回值被意外修改,但这种用法比较少见,且有争议。...// 有了const返回值,这行代码会报错,阻止了这种无意义的操作。对于内置类型,返回 const 值没有意义。现代 C++ 中,这种用法已不常见。3.

26610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++核心准则编译边学-F.20 输出结果时更应该使用返回值而不是输出参数

    返回值本身可以说明用途,而引用类型可以是输入/输出参数也有可能只是输出参数,容易被误用。...建议为返回值增加const修饰的观点认为,这样会阻止(极少发生的)对临时变量的意外访问。相反的观点认为这样做会(非常多地)阻止移动语义的运用。...To reuse an object that carries capacity (e.g., std::string, std::vector) across multiple calls to the...为了让处于内循环中的函数调用可以重复使用带有容量的对象(例如std::string,std::vector):把它看做输入/输出参数并通过引用传递。...警告那些没有在写之前读(没有输入用途)而且可以低成本返回的参数,它们应该作为返回值输出。 Flag returning a const value.

    2.2K30

    const详解

    所以:const 只能修饰输入作用的参数 3.1.1 如果参数为指针 如果输入参数为指针,加上const之后就会起保护指针意外修改的作用。...3.2 const修饰函数返回值 修饰返回值,就是不能修改返回值 对于函数来说,返回值如果是int类型的值,就算用const限定,但是函数调用结束会清楚栈,因此没有必要 如果函数返回值是指针的话,我们加上限定符号...class Stock { private: std::string company; long share; double share_val; double total_val;...void set_tot() { total_val = share_val * share; } public: Stock(); ~Stock(); Stock(const std:...使用const的好处 可定义常量 防止意外修改造成的错误 便于进行类型检查 const常量有数据类型,而宏常量没有数据类型。

    82030

    【C++】类型转换详解:显式与隐式转换的艺术

    0; } 返回值转换:函数返回值会被转换为函数声明的返回类型 double calculate() { return 42; // 42(int)被隐式转换为42.0(double)...当高精度类型向低精度类型转换时,可能发生数据丢失 double d = 3.14159; int i = d; // 隐式转换,i的值为3,小数部分被截断 符号问题:有符号类型与无符号类型之间的转换可能导致意外结果...std::endl; } else { std::cout = b" std::endl; // 这行会被执行 } 三、显式类型转换 显式类型转换...不要修改真正声明为const的对象,这会导致未定义行为 谨慎使用reinterpret_cast:这种转换完全依赖程序员的判断,误用会导致严重错误 类设计中控制转换行为:使用explicit关键字防止意外的隐式转换...构造函数实现 } }; void func(MyString s) { // 函数实现 } int main() { // func("hello"); // 编译错误,防止了意外的隐式转换

    25210

    C++20 中的 std::ssize:探索其功能与优势

    一、std::ssize 的定义与功能std::ssize 是一个模板函数,它返回给定容器或数组的大小,但与 std::size 不同的是,它返回的是一个有符号整数类型。...具体来说,std::ssize 的返回类型是 std::common_type_tstd::ptrdiff_t, std::make_signed_t>,这意味着它会将容器的大小转换为一个有符号的整数类型...返回值容器或数组的大小,以有符号整数形式返回。二、为什么需要 std::ssize在 C++ 中,size() 方法通常返回一个无符号整数类型(如 std::size_t)。...例如,当你需要对容器的大小进行减法操作时,无符号整数可能会导致意外的行为。...三、std::ssize 的使用场景1. 容器std::ssize 可以与各种标准库容器一起使用,例如 std::vector、std::list 等。

    17400

    C++11 Lambda表达式

    [ ] (double x) -> double {int y = x; return x - y;} /*注:Lambda函数没有声明返回类型,其返回类型相当于使用decltyp根据返回值推断得到的...但是仅当函数体完全由一条返回语句组成时,自动类型推断才管用 否则,需要使用新增的返回类型后置语法*/ 【注:Lambda表达式自动推断返回值类型:有些编译器,像GCC,即使你有多于一个返回语句也不可以自动推断成功...,但标准不保证这一点,因此为了防止意外的发生,当函数体内返回语句不止一条的时候,建议使用返回类型后置语法】 其中captures为捕获,它一个包含0个或者多个捕获符的用逗号分隔的列表。...::cout; std::vector numbers(Size); std::srand(std::time(0)); std::generate(numbers.begin()...= std::count_if(numbers.begin(), numbers.end(), [](int x){return x % 3

    44230

    C++ const 用法全面总结与深度解析

    它可以应用于变量、指针、函数参数、返回值、成员函数等多种场景,深刻影响代码的正确性和性能。1.1本质与编译期处理const变量在编译时会被编译器严格检查,任何修改尝试都会导致编译错误。...::cout返回值2.4.1返回const值的意义收起代码语言:C++运行AI代码解释constintgetValue...intmain(){getValue()=20;//错误:不能修改返回的临时常量constintx=getValue();//正确return0;}对基本类型而言,返回const值意义不大,但对类类型可防止意外赋值...classBigNumber{public:BigNumberoperator+(constBigNumber&other)const;};BigNumbera,b,c;(a+b)=c;//如果返回非const,这行会意外通过编译...─常量指针(T*const)│└──指向常量的常量指针(constT*const)├──引用修饰(constT&)├──函数相关│├──参数修饰(constT,constT*,constT&)│├──返回值修饰

    20900

    C++奇迹之旅:双向链表容器list的灵活使用技巧

    它防止了构造函数在不经意间被用于类型转换,从而避免可能导致意外错误或不明确的转换。...避免误用:如果构造函数不是 explicit,那么它可以在赋值或函数参数传递时被自动调用,可能会导致意外的类型转换或逻辑错误。...返回值是 size_type size_type size() const; 示例: #include #include int main() { std:...= mylist.end()) { it = mylist.erase(it); // 通过将it指向erase的返回值来处理 } } 在这段代码中,mylist.erase(it) 会返回指向被删除元素后一个元素的迭代器...std::list提供了四种构造函数:默认构造、填充构造、范围构造和拷贝构造,其中部分构造函数使用了explicit关键字来防止意外的类型转换。

    44510

    《Effective C++》读书笔记(一):让自己习惯C++(条款01~04)

    3.2 让函数返回常量值 函数返回一个常量值,可以避免一些意外。....}; //乘法运算符重载 const Rational operator* (const Rational& lhs, const Rational& rhs); 意外: Rational a,b,...在成员函数中,比如operator[]的重载,如果函数返回值不加const,也不是引用返回,那么这样是错误的: a[0] = 'x'; 因为如果函数的返回类型是一个内置类型,那么改动函数返回值是不合法的...std::size_t numDisks() const; //... }; extern FileSystem tfs;//给用户使用的对象 在源码文件B中,调用源码文件A的对象: class...std::size_t disks = tfs.numDisks();//使用源码文件A中的对象 //... } //创建Directory对象 Directory tempDir(data)

    34710

    C++中const和constexpr的区别:了解常量的不同用法

    通过const修饰能够避免意外的数值修改。constexpr关键字的作用:声明一个常量表达式,要求在编译时期计算出结果,以产生一个编译时常量。...编译时类型检查:使用const可以将变量声明为只读,确保在编译时不会发生意外的修改。如果尝试在const变量上进行写操作,编译器会报错。...重点注意的是,constexpr函数的参数和返回值类型必须是能够在编译期间确定的常量表达式。...同样地,constexpr函数在编译时执行,并且其参数必须是常量表达式,返回值也必须是常量表达式。...4.4、对函数的适用性const:const 可以用于函数参数和函数返回值的声明。在函数参数中,const 可以表示该参数不会被修改;在函数返回值中,const 可以表示返回的值为常量。

    76710

    c++之内存模型

    可执行程序,未执行程序前分为两个区域: 代码区: 存放cpu执行的机器指令 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中存有一份代码即可; 代码区是只读的,使其只读的原因是防止程序意外修改了它的指令...该区域的数据在程序结束后由系统释放; #include using namespace std; //全局变量 int c = 10; int d = 10; //const修饰的全局变量...程序运行后: 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等; #include using namespace std; int* func(int b) {...形参也会存储在栈区; b = 10; int a = 10; //不要返回局部变量的地址 return &a; } int main() { //接收func的返回值...#include using namespace std; int* func(){ //利用new在堆中开辟内存 //指针本质也是局部变量,存放在栈上,指针保存的数据是存放在堆区

    82910

    C++23 的新特性:std::unreachable

    什么是 std::unreachable?std::unreachable 是一个标准库函数,定义在 头文件中。...如果程序意外执行到 std::unreachable 所标记的位置,将触发未定义行为。2....如果程序意外执行到 std::unreachable,将触发未定义行为。3. 编译器优化std::unreachable 的一个重要作用是帮助编译器进行优化。...调试支持除了优化,std::unreachable 还可以在调试构建中提供支持。当程序意外执行到不可达代码时,编译器可以选择捕获这种情况,以防止程序继续执行。...注意事项虽然 std::unreachable 提供了许多好处,但它也引入了未定义行为。如果程序意外执行到 std::unreachable 标记的位置,可能会导致不可预测的结果。

    26800

    RFC 导读 | 构建安全的 IO

    AsRawFd>(input: &FD) -> io::Result { some_syscall(input.as_raw_fd()) } AsRawFd并没有限制as_raw_fd的返回值...; // 从任意的整数值构造 file // 然而这种类型的检查在运行时可能无法识别一个合法存活的资源 // 或者它可能意外地在程序的其他地方被以别名方式封装处理(此处无法判断) // 这里添加 unsafe...; // 进一步使用 raw_fd ,也就是 file 的内部原始句柄,将超出操作系统与之相关的生命周期 // 这可能会导致它意外地与其他封装好的 file 实例发生别名,比如 another /...dangling = unsafe { File::from_raw_fd(raw_fd) }; 调用者必须确保传入from_raw_fd的值是明确地从操作系统返回的,而且from_raw_fd的返回值不会超过操作系统与句柄相关的生命周期...[cfg_attr(io_lifetimes_use_std, feature(io_safety))] /// use std::fs::File; /// # use std::io

    1.1K10
    领券