gpt4 book ai didi

c++ - 与临时对象一起使用时了解 C++ std::shared_ptr

转载 作者:太空狗 更新时间:2023-10-29 20:19:46 24 4
gpt4 key购买 nike

我试图了解 shared_ptr p 在构造未命名的 shared_ptr 时的用法,以及它对 p< 的影响。我在玩弄自己的示例并编写了以下代码:

shared_ptr<int> p(new int(42));
cout << p.use_count() << '\n';
{
cout << p.use_count() << '\n';
shared_ptr<int>(p);
cout << p.use_count() << '\n';
}
cout << p.use_count() << '\n';

Output:
1
1
0
1
  1. 第 5 行使用 p 创建临时文件是否正确? shared_ptr(即未命名的 shared_ptr)?
  2. 如果是这样,为什么 use_count 没有增加。 temp.object 是否被销毁在我们退出第 7 行的 block 之前。
  3. 如果它被销毁并且 p 在 block 内的使用计数变为零,怎么出 block 后又是1呢?

如果我在第 5 行使用命名的 shared_ptr q,即:

shared_ptr<int>q(p);

一切都会按预期工作,在第 5 行之后的 block 内使用计数将为 2,在我们退出 block 后它将再次为 1。

最佳答案

根据 C++ 标准(8.5.1.3 显式类型转换(函数符号))

1 A simple-type-specifier (10.1.7.2) or typename-specifier (17.7) followed by a parenthesized optional expressionlist or by a braced-init-list (the initializer) constructs a value of the specified type given the initializer...

所以这个表达式语句中的表达式

shared_ptr<int>(p);

看起来像一个显式类型转换(函数式)表达式。

另一方面,声明中的声明符可以用括号括起来。例如

int ( x );

是一个有效的声明。

所以这个声明

shared_ptr<int>(p);

可以解释为这样的声明

shared_ptr<int> ( p );

所以有歧义。

C++ 标准通过以下方式解决这种歧义(9.8 歧义解决)

1 There is an ambiguity in the grammar involving expression-statements and declarations: An expression statement with a function-style explicit type conversion (8.5.1.3) as its leftmost subexpression can be indistinguishable from a declaration where the first declarator starts with a (. In those cases the statement is a declaration.

因此内部代码块中的这条语句

shared_ptr<int>(p);

是一个名为 p 的新共享指针的声明,它隐藏了外部代码块中具有相同名称 p 的对象的先前声明,即使用默认构造函数创建

constexpr shared_ptr() noexcept;

根据这个构造函数的描述

2 Effects: Constructs an empty shared_ptr object.

3 Postconditions: use_count() == 0 && get() == nullptr.

如果您想处理表达式而不是声明,那么您需要做的就是将语句主体括在括号中,从而在表达式语句中获得主表达式。

这是一个演示程序。

#include <iostream>
#include <memory>

int main()
{
std::shared_ptr<int> p( new int( 42 ) );

std::cout << "#1: " << p.use_count() << '\n';

{
std::cout << "#2: " << p.use_count() << '\n';

( std::shared_ptr<int>( p ) );

std::cout << "#3: " << p.use_count() << '\n';
}

std::cout << "#4: " << p.use_count() << '\n';

return 0;
}

在这种情况下它的输出是

#1: 1
#2: 1
#3: 1
#4: 1

关于c++ - 与临时对象一起使用时了解 C++ std::shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56652083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com