V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  amiwrong123  ›  全部回复第 13 页 / 共 39 页
回复总数  777
1 ... 9  10  11  12  13  14  15  16  17  18 ... 39  
2022-01-19 01:09:22 +08:00
回复了 amiwrong123 创建的主题 C++ 定义了移动构造函数,会导致赋值操作符被删除?
@elfive #6
就是说,这样,string 才会调用 Move constructor 。
但我看了写资料,说 std::move 只是相当于一个 static_cast<T&&>而已,并没有做任何移动操作。而移动操作,实际上是 一个接管的动作。

我现在就很难以理解 移动操作。也很好奇 string 的移动操作是怎么做的。

我就说下我简单的理解,就好比:
- 之前,旧对象要被 delete ,新对象要被 new 出来
- 现在,新对象不 new 了,直接指向了旧对象,旧对象不用被 delete 了
2022-01-19 01:04:01 +08:00
回复了 amiwrong123 创建的主题 C++ 定义了移动构造函数,会导致赋值操作符被删除?
@dangyuluo #2
@elfive #5
![]( https://i.bmp.ovh/imgs/2022/01/c7d19607254b1f4d.png)
还想问个问题,红框里这种句是什么情况阿?前面那句倒是理解了,就是 rule of five 。
2022-01-19 00:24:14 +08:00
回复了 amiwrong123 创建的主题 C++ 定义了移动构造函数,会导致赋值操作符被删除?
@dangyuluo #2
所以,Copy constructor 、Move constructor 、Copy assignment operator 、Move assignment operator 、Destructor 这五个东西,只要用户自己定义了其中一个,那么其他的 都会被删除。
```cpp
#include <iostream>
using namespace std;
struct Token
{
int label;
string content;
Token(int _label = -1, string _content = "")
: label(_label)
, content(_content)
{
cout << "defalut" << endl;
}

Token(Token&& d)
: label(d.label)
, content(d.content)
{
cout << "move" << endl;
}

Token& operator=(Token&&) = default;//不加这句,就会报错
};

int main()
{
Token label_1(1, "hello");

label_1 = Token(2, "hell");//这里是一个临时变量,所以属于一个右值。所以必须用 Move assignment operator
return 0;
}
```

所以这个程序,就验证了呗( c++基础不是很扎实,所以想确认一下子)😂
2022-01-14 22:55:09 +08:00
回复了 amiwrong123 创建的主题 C++ inline 不能修饰一个全局函数呗?
first.cpp
```cpp
#include <iostream>
using namespace std;

inline void g_f() {
cout << "first" << endl;
}

void a() {
cout << "a" << endl;
g_f();
}
extern void b();

int main()
{
a();
b();
return 0;
}
```

second.cpp
```cpp
#include <iostream>
using namespace std;

inline void g_f() {
cout << "second" << endl;
}

void b() {
cout << "b" << endl;
g_f();
}
```

我把 main 函数放到 first.cpp 里,也是一样。都是打印 second 。不过是在 VS2019 里。

然后我用 Ubuntu 下的 gcc 又试了一下,main 函数分别 first 里或 second 里,却是都打印的是 first 了。看来是一个随机的情况,也就是楼上说的“inline 现在的含义是允许一个函数 /变量在多个编译单元重复定义,在链接的时候会随机挑选一个符号链上。”
2022-01-14 22:27:35 +08:00
回复了 amiwrong123 创建的主题 C++ inline 不能修饰一个全局函数呗?
@jobmailcn #13
老哥你看一下我上面那个程序,我这个程序应该就是你说的:如果内联了,当然不存在符号问题。

但是还是有点不明白,调用 a()的时候,不应该用的是 first.cpp 里的函数定义吗,怎么还是用的 second.cpp 里的函数定义。
2022-01-14 22:25:20 +08:00
回复了 amiwrong123 创建的主题 C++ inline 不能修饰一个全局函数呗?
@codehz #6
老哥你看一下我上面那个程序,我这个程序应该就是你说的:允许同符号在多个翻译单元中多次出现
g_f 函数在两个翻译单元都出现了。

本来我以为会打印出来
a
first
b
second
但是却不是。

我不知道该怎么解释我的程序结果了
2022-01-14 22:10:39 +08:00
回复了 amiwrong123 创建的主题 C++ inline 不能修饰一个全局函数呗?
@GeruzoniAnsasu #7
没想到你这个居然编译通过了,那感觉你这个 inline 就好像起到了 static 的作用呢??因为两处的 g_f(){}的符号应该是一样的应该出产生冲突的,但是却没有。

然后我根据你的这个程序,写了下面这个:
first.cpp
```cpp
#include <iostream>
using namespace std;

inline void g_f() {
cout << "first" << endl;
}

void a() {
cout << "a" << endl;
g_f();
}
```

second.cpp
```cpp
#include <iostream>
using namespace std;

inline void g_f() {
cout << "second" << endl;
}

extern void a();
void b() {
cout << "b" << endl;
g_f();
}

int main()
{
a();
b();
return 0;
}
```
然后打印出来这个,这个怎么解释呢?😂
a
second
b
second
2022-01-12 16:23:31 +08:00
回复了 ligiggy 创建的主题 C++ 左值右值,有没有通俗易懂且具体的资料
所以楼主觉得哪个文档比较通俗易懂😂
2022-01-12 10:01:52 +08:00
回复了 amiwrong123 创建的主题 C++ 对 delete 和 shared_ptr 的行为 这么理解正确吗?
@mingl0280
delete[]会遍历所有数组项然后释放内存

感觉这次遍历好像做了一次无用功呢,也没有析构函数可以调
2022-01-10 00:47:14 +08:00
回复了 raycool 创建的主题 程序员 印象笔记神坑,每月 20 元的高级用户竟然不支持代码块。
语雀不香嘛
2022-01-02 22:34:09 +08:00
回复了 amiwrong123 创建的主题 问与答 语雀,直接输入``不能变成行内代码块?
@calano #9
原来要按下 enter 呀😂
2022-01-01 19:30:21 +08:00
回复了 amiwrong123 创建的主题 程序员 怎么通过 VS2019 看 strlen()的源码?
@ipwx #8
@msg7086 #10
算了,核心函数自己看下原理就行了。

另外,如果想看一眼 C++标准库比如 vector 的实现(比如我可能就想看一下 vector 的拷贝构造函数,看它是怎么构造的),是建议从 vs 里看吗,还是从 clion 里(把 gcc llvm 搞到 Windows 上)?或者其他方式
2022-01-01 19:26:03 +08:00
回复了 amiwrong123 创建的主题 程序员 怎么通过 VS2019 看 strlen()的源码?
@ipwx #8
我蒙了,一个 strlen 居然能写的这么复杂,我反正咋一看没看懂咋回事。算了,吃饭去了回头再看。

我只是想看一个 简明的版本罢了
2022-01-01 18:57:49 +08:00
回复了 amiwrong123 创建的主题 程序员 怎么通过 VS2019 看 strlen()的源码?
@ipwx #3
@kokutou #5
谢谢,原来是这样的阿😂
2022-01-01 17:58:08 +08:00
回复了 amiwrong123 创建的主题 程序员 怎么通过 VS2019 看 strlen()的源码?
@x1596357 #1
好吧,我也不是非得通过,msvc 的方式来看源码的。

那问下层主,有没有别的方式,可以方便看 c 或 c++源码的?最好是 能通过 ctrl 点击跳转这种形式。(把 https://github.com/microsoft/STL 下载下来,然后用 sublime 打开,再用一个跳转插件,好像也能实现)

或者说,你们平时看 c 或 c++源码,都是通过什么方式来看的呀?
2022-01-01 15:12:55 +08:00
回复了 amiwrong123 创建的主题 问与答 语雀,直接输入``不能变成行内代码块?
@calano #6
三个是怎么输的,我这都是两个啊。而且你导出语雀的文档,看到的也是两个。😂
2022-01-01 11:59:58 +08:00
回复了 amiwrong123 创建的主题 问与答 语雀,直接输入``不能变成行内代码块?
@quzard #1
@sola97 #3
发现了,打完`int`后,再按一下空格,就会自动转换为 代码块了😂
1 ... 9  10  11  12  13  14  15  16  17  18 ... 39  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   978 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 23ms · UTC 20:56 · PVG 04:56 · LAX 12:56 · JFK 15:56
Developed with CodeLauncher
♥ Do have faith in what you're doing.