C++ 左值右值及引用

C++11 新特性 ② | 左值、左值引用、右值与右值引用 详细讲述左值、左值引用、右值与右值引用相关概念。 阅读详情

参考
参考
左值是一个引用内存位置的表达式,它允许我们通过 & 运算符获取该内存位置的地址。
纯右值 prvalue 是没有标识符、不可以取地址的表达式,一般也称之为“临时对 象
返回非引用类型的表达式
如 x++、x + 1
除字符串字面量之外的字面量如 42、true

将亡值:
隐式或显式调用函数的结果,该函数的返回类型是对所返回对象类型的右值引用

static_cast<int&&>(7);
std::move(7);

类成员访问表达式,指定非引用类型的非静态数据成员,其中对象表达式是xvalue

struct As
{
    int i;
};

As&& f(){
    return As();
}

int main()
{
    f().i; 

    return 0;
}
#include <iostream>
#include <type_traits>
void reference(int& v) { std::cout << "left" << std::endl; }

void reference(int&& v) { std::cout << "right" << std::endl; }

// T类型需要被推导,所以v的类型可能是左引用类型或右引用类型,但v本身是一个左值;
template <typename T>
void Func(T&& v) {
  std::cout << std::is_lvalue_reference<decltype(v)>::value << ","
            << std::is_lvalue_reference<T&&>::value << std::endl;

  std::cout << std::is_rvalue_reference<decltype(v)>::value << ","
            << std::is_rvalue_reference<T&&>::value << std::endl;

  // 经过坍缩性/引用折叠,i:类型T的lvalue被推导为T&,v类型为int&, 1:
  // 类型T的rvalue被推导为T,v类型为int&&, 但v本身是一个左值,只能绑定到左引用
  // 若想绑定到右引用,则需要std::move(v)将v左值转换为右值;
  reference(v);

  reference(static_cast<T&&>(v));  // T&&可能是左引用或右引用
  reference(std::move(v));
}

template <typename T>
void Forward(T&& v) {
  // std::forward保留原来的左值性或右值性,相应的函数就会正确调用
  reference(std::forward<T>(v));
}

int main() {
  int i = 0;
  Func(i);  // i是一个左值
  std::cout << "----------" << std::endl;

  Func(1);  // 1是一个右值(纯右值)

  std::cout << "----------" << std::endl;
  Forward(i);
  Forward(1);
}
BrepNet实战:5分钟搞定三维CAD模型的加工特征识别(附Python代码) 本文详细介绍了BrepNet在三维CAD模型加工特征识别中的实战应用,通过Python代码演示了从环境搭建到模型训练的全流程。BrepNet基于边界表示(BRep)的深度学习框架,能够高效识别加工特征,显著提升工业设计和智能制造领域的效率。文章还提供了性能优化和部署建议,帮助开发者快速实现AI驱动的几何特征识别。 阅读详情

相关推荐

5分钟搞定Conflux钱包注册:Fluent钱包从安装到转账全流程指南

本文提供Conflux公链上Fluent钱包的完整注册和使用指南,涵盖从安装、助记词备份到CFX转账的全流程。特别强调安全操作要点,包括助记词保管和网络选择,帮助用户5分钟内快速掌握这款国产公链钱包的核心功能,确保数字资产安全。

weixin_29181861的博客 244

详解 C++ 左值、右值、左值引用以及右值引用

主要讲解了 C++11 的右值引用(及其支持的移动语义和完美转发)。

Butayarou的博客 2万+

RK3588部署Zipformer模型问题总结

本文分享了在RK3588嵌入式设备上部署小米Zipformer语音识别模型时遇到的问题及解决方法。主要遇到两个问题:1)在rknn_model_zoo例程编译时出现静态库版本不兼容,通过重新编译kaldi-native-fbank库并修改链接路径解决;2)sherpa-onnx编译时提示缺少portaudio库,通过修改编译脚本启用相关宏定义后成功编译。最终成功在RK3588上运行Zipformer模型,测试结果显示该模型具有较好的识别效果和实时性(RTF=0.22),验证了其在边缘设备上的适用性。

pkyang2004的博客 2145

c++——左值、右值、左值引用、右值引用

1、左值和右值 左值(left-values),缩写:lvalues 右值(right-values),缩写:rvalues 直接上官网查,我一向倡导自己去懂得原理,而原理都是老外写的,当然我只是针对c++编程语言这样说。 https://msdn.microsoft.com/en-us/library/f90831hc.aspx 翻译:所有的c++表达,不是左值就是右值。 lvalu...

coco的博客 2万+

一文详解数据仓库、数据湖、湖仓一体和数据网格

本文对数据仓库、数据湖、湖仓一体、数据网格四个技术概念进行了辨析,并对它们的优势和局限给出了对比介绍。

oOBubbleX的博客 2595

基于deepseek本地模型的本地知识库构建

通过以上步骤,你已经成功构建了一个基于 AnythingLLM 和 LM Studio 的本地知识库。这个系统不仅能够高效地存储和检索知识,还能结合强大的语言模型生成准确的回答。你可以根据自己的需求进一步扩展和优化这个系统,比如增加更多的文档格式支持、优化检索算法等。

qq_30178745的博客 1383

C++ 左值引用与右值引用超详解

左值一般为我们自己定义的变量,在定义时开辟了内存,我们可以对这块内存赋值,修改内存中的值,如果有const也仅从语法层面上不允许修改,这块内存在其生命周期结束的时候销毁。右值一般为临时变量,是程序运行时产生的中间产物,他不是我们用户自己定义开辟空间的,是由编译器帮我们开辟空间,并且在用完就立即销毁。右值的生命周期一般只在当前语句,当我们要对右值进行赋值时,他已经释放空间了,此时我们再进行访问就是野访问,(与野指针一样造成内存问题),所以我们不能对右值进行修改,编译器强制语法检查,遇到修改操作就报错。

2301_79964905的博客 6386

R 分析裂区试验设计

裂区试验有主区部分和副区部分, 因而有主区部分误差(误差 a,简记为Ea )和副区部分误差(误差b,简记为Eb) 分别用于测验主区处理以及副区处理和主、副互作的显著性。对同一个二因素试验资料作自由度和平方和的分解,则可发现随机区组的误差项自由度和平方和分别为DFe、SSe,而裂区设计有两个误差项,其自由度和平方和分别为DFEa,DFEb, SSEa, SSEb。而区组,处理效应等各个变异项目的自由

samhuairen的专栏 8934

C++ 右值 左值引用

在C++11前都是在mian()函数中定义ret再传给operator+(),延长生命周期。这时候就需要forward<T>()完美转发,保持参数属性,左值还是左值,右值还是右值。因为在传参时右值变为了左值,导致调用Fun()函数时t参数的属性永远是左值。注意区分右值引用和万能引用:下面的函数的 T&& 并不是万能引用,的 && 表示右值引用(比如:int&& ,string&&),将一个对象的资源转到另一个对象上。中的 && 不表示右值引用,而是。首先我们要了解什么是万能引用。为什么都调用的左值引用呢?

wws7920的博客 1808

ROS入门(一)——ROS安装(vmware16+ubuntu20.04+ROS-Noetic)

嵌套:ROS可以在Ubuntu上运行,Ubuntu在虚拟机Vmware中安装。 从 虚拟机vmware安装→ubuntu安装→ros安装,逐步介绍安装ROS环境的过程。整个过程是我一步步跟着各种博客安装实现的,亲测可行。 版本: Vmware :Vmware Workstation16 Ubuntu :20.04 ROS :Noetic 其中vmware直接载当前最新版本就好,而ubuntu的版本要注意一下。 在ROS官网(cn - ROS Wiki),我们进入到ROS安装的步骤界面,可以看..

Netceor的博客 9740

ESP32-C3入门教程 环境篇②——Windows开发环境准备

文章目录一、注意事项二、下载ESP-IDF工具安装器三、安装内容四、详细安装步骤报错处理 一、注意事项 请注意 ESP-IDF 和 ESP-IDF 工具的安装路径不能超过 90 个字符,安装路径过长可能会导致构建失败。 Python 或 ESP-IDF 的安装路径中一定不能包含空格或括号。 除非操作系统配置为支持 Unicode UTF-8,否则 Python 或 ESP-IDF 的安装路径中也不能包括特殊字符(非 ASCII 码字符、中文字符) 二、下载ESP-IDF工具安装器 ESP-IDF Win

5244

C++左值、右值、左值引用、右值引用

#include <iostream> #include <vector> #include <string> #include<utility> using namespace std; class A { public: A() { a = 666; cout << "构造A" << endl; } A(const A&a) { cout << "拷贝构造A" << endl; .

DayDayUp 3430

【SAP HANA 46】关于HANA CPU高峰到 80-100%

关于HANA CPU高峰到 80-100%

探索 Java 编程的技巧、最佳实践和解决方案。本博客提供针对 Java 开发者的实用指南,涵盖从基础到高级话题,旨在提升编程效率和技能。 429

C++左值引用及右值引用

这里的临时对象是肯定会被销毁的,如果能够将临时对象的资源直接移交给接收对象,那么就可以减少一次拷贝。在 C++11标准产生之前,是没有右值引用这个概念的,当时如果想要一个类型既能接收左值也能接收右值的话,需要用const左值引用,比如标准容器的 push_back 接口:void push_back (const T& val)。右值引用 rr2 引用右值 x + y 后,该表达式的返回值被存储到特定的位置,不能取表达式返回值 x + y 的地址,但是可以取 rr2 的地址,也可以修改 rr2。

u010371321的博客 1006

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++ 左值引用和右值引用

1、引用是别名2、声明时必须初始化3、通过引用修改变量4、引用的本质是指针常量三、区分左值和右值1、左值可以在等号左边,能够取地址,具名;比如变量名、返回左值引用的函数调用、前置自增/自减、赋值运算符、解引用等2、右值只能在等号右边,不能取地址,不具名;右值分为纯右值和将亡值,纯右值比如字面值、返回非引用类型的函数调用、后置自增/自减等1、将亡值是C++11引入的一种新的引用类型,用于支持移动语义的实现;2、在C++中,表达式具有值的属性,可以分为左值和右值。

weixin_51795597的博客 1694

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++左值、右值、左值引用、右值引用的详解

左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体;右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。

咸鱼爱幻想的博客 1111

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

详解 C++ 左值和右值对象 左值引用和右值引用

左值 (lvalue):左值是“locator value”的缩写,表示可以定位到内存地址的实体。通常是可以被赋值的对象,比如变量。左值有持久的身份(identity),可以在程序中被多次访问。右值 (rvalue):右值是“right value”的缩写,表示临时或短暂的值,通常不能被直接赋值。右值没有持久的身份,通常是表达式计算的中间结果或字面量。左值引用是用符号声明的引用,它只能绑定到左值。左值引用是 C++98 中就有的特性,用于避免对象拷贝或修改原始对象。右值引用是用&&

cxyhjl的博客 915

C++左值与右值及引用的总结

本文深入解析了C++中的左值(lvalue)和右值(rvalue)概念,重点介绍了现代C++引入的右值引用机制。左值代表具名持久对象,右值则是临时值。右值引用(&&)允许高效处理临时对象,实现移动语义以避免不必要的拷贝。文章详细阐述了值类别系统、引用绑定规则、移动构造函数/赋值运算符的实现及优势,并指出了常见陷阱和最佳实践。这些概念是掌握现代C++高效编程的核心,对性能优化和资源管理至关重要

2401_88413914的博客 1243

C++面试 左值、右值、左值引用、右值引用

1、左值和右值 左值(left-values),缩写:lvalues ,located value 可定位值,其含义是可以明确其存放地址的值,更确切说对其的使用是基于地址 右值(right-values),缩写:rvalues , read value 可读的值,通常指代赋值运算=右侧的常量值,字面值,或者函数的返回值,它们没有具体的指代名,即无法通过地址访问,通常在赋值表达式结束后变销毁。 一般可以认为:左值对应变量的地址,右值对应变量的值,首先说左值和右值,他们绝不是简单的等号左边和右边的..

u014430031的博客 4114

C++ 左值、右值、左值引用、右值引用

一、左值右值 1.1 定义 在C++中有几个晦涩的概念:左值、右值、泛左值、纯右值、将亡值 泛左值=左值+将亡值; 右值=纯右值+将亡值; 我们可以发现将亡值既属于泛左值又属于右值; 这些分类是由于它们具有不同性质而命名的,但其实我们只需要掌握左值和右值的概念就已经足够了。 这5种值类型我总结了一张表格,如下: 首先这几个名词用来形容一个表达式,在C++中,一切表达式都必然属于左值、将亡值、纯右值中的一种。而右值=将亡值+纯右值,所以我们又可以说一切C++表达式都必然要么是左值要么是右值。

茶佬牛逼 857

C++左值,右值,左值引用,右值引用,万能引用,完美转发

int a = 10;对于上面的两行代码来说,a, p, *p 都是左值10,string ("111") 都是右值,这两个都不能取地址和,这两类对象的特点是:都属于将亡值,即这两类对象的生命周期都只在对象创建出来的那一行。

weixin_46366676的博客 1210

【C++左值、右值、左值引用、右值引用】【转载】

右值引用将左值与右值区分开来。它们可以帮助您通过消除不必要的内存分配和复制操作来提高应用程序的性能。它们还使您能够编写接受任意参数的函数的一个版本,并将其转发给另一个函数,就好像直接调用了另一个函数一样左值、右值、左值引用、右值引用。

j8267643的博客 1033

C++ 左值引用与右值引用介绍

C++11引入了左右值引用机制,左值引用(T&)只能绑定左值,用于避免拷贝和参数传递;右值引用(T&&)专用于绑定临时对象,支持移动语义和完美转发,提升性能。关键区别在于:左值引用操作持久对象,右值引用处理临时值。移动构造函数和std::forward利用右值引用实现资源转移和完美参数转发。使用时需注意悬挂引用和对象状态问题。该特性显著优化了C++的资源管理效率。

Tipriest的博客 1082

C++ 左值引用与右值引用的作用及实现原理

定义及作用 左值:表示对象的身份,生命周期持久。 对左值的修改实际上就是对对象的修改。 右值:表示对象的值,生命周期短暂。 左值引用的设计直接原因就是方便运算符重载。 比如对于+运算符的重载如果没有引用会写成 A operator +(const A *a, const A *_a); ,使用要写成&a+&b,而有了引用可以直接写成A operator +(const A &a, const A &_a); 和a+b,语法更简洁,也不容易出错。 引用由于要初始化并且不能更改绑

AI06le的博客 2106
上一篇: C++调用子类函数
下一篇: C++ std::move
最后冰吻free
博客等级 码龄12年 121粉丝 371原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值