【问题标题】:owner<T*> p syntax in cpp core guidelinescpp 核心指南中的 owner<T*> p 语法
【发布时间】:2017-12-17 20:24:32
【问题描述】:

在 cpp 核心指南中:Example of non owning raw pointer 看不懂下面的代码:

 template<typename T>
class X2 {
    // ...
public:
    owner<T*> p;  // OK: p is owning
    T* q;         // OK: q is not owning
};

owner&lt;T*&gt; p 的语法是什么?

【问题讨论】:

  • p 是类owner 的一个实例,它是一个模板并接受参数T*?你问的是这个吗?
  • 是否链接到this one
  • 是的!现在我真的明白它来自哪里了!这在 microsoft 库中声明为空模板

标签: c++ c++14 cpp-core-guidelines


【解决方案1】:

页面下方有一条关于owner语义的注释:

注意 owner&lt;T*&gt; 没有超出T* 的默认语义。它可以在不更改任何使用它的代码的情况下使用,并且不会影响 ABI。它只是程序员和分析工具的指标。例如,如果 owner&lt;T*&gt; 是某个类的成员,则该类最好有一个析构函数 deletes 它。

基本上和提议的std::observer_ptr差不多。不同之处在于owner 存储了一个指针并“拥有”它,尽管它不像std::unique_ptr 那样做任何RAII。当您想更明确地表明原始指针是拥有指针时,应该使用它。

注意这里的“语法”只是模板类的变量,不是关键字什么的。

【讨论】:

  • 所以“所有者”不是 cpp 关键字,它只是在其他地方定义的模板?
  • @user3880722 正是:)
  • @Galik 也基本一样,什么都不做。
  • @Galik 我明白你的意思。语义不同,但它们做的事情完全相同。
【解决方案2】:

正如 Rakete1111 提到的,owner&lt;T*&gt; 与 T* 相同。所以我们可以将owner 作为 T 的类型别名。

template<class T>
using owner = T;

现在我们可以为我们的代码制定一个约定,当包含指针的类负责删除指针时,指针由owner 定义。

所有者充当原始指针的简单示例:

owner<int*> p = new int;
*p = 1;
std::cout<<*p; // 1

【讨论】:

  • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
猜你喜欢
  • 1970-01-01
  • 2019-06-24
  • 2017-03-07
  • 2020-05-29
  • 1970-01-01
  • 2016-10-23
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多