C26414 使用 CRecordset 的问题

C26414 issue with using CRecordset

我在这里 (C++ Code Analysis in Visual Studio Community 2019 produces warnings C26486 and C26414) 看到过类似的讨论,其中提到使用 std::move 但我不确定这是否是我需要做的。

我把CRecordset *pRecords = new CRecordSet(&m_dbDatabase)变成了智能指针。像这样:

auto pRecordset = std::make_unique<CRecordset>(&m_dbDatabase);

现在我收到 8 个类似的代码分析警告:

C26414: Move, copy, reassign or reset a local smart pointer 'pRecords' (r.5).

我想我知道这可以变成我的 CPTSDatabase class 的成员变量,在打开数据库时填充它。然后简单地使用相同的指针。

为了尝试这样做,我将其添加到我的头文件中:

auto m_pRecords = std::unique_ptr<CRecordSet>;

然后我打算在打开数据库后这样做:

m_pRecords = std::make_unique<CRecordSet>(&m_dbDatabase);

但它不喜欢我定义变量的方式。

我该如何解决这个问题?

您尝试将 auto 用于 class 成员 m_pRecords 时有两个错误。

首先,您不能将 auto 用于(非静态)class 成员变量。我在 this C++17 Draft Standard 中找不到 explicit 规则,但是 [dcl.spec.auto][=40= 的第一部分] 部分确实间接地覆盖了它(强调我的):

10.1.7.4 The auto specifier       [dcl.spec.auto]

1     The auto and decltype(auto) type-specifiers are used to designate a placeholder type that will be replaced later by deduction from an initializer. …

因此,在定义 class 时,later 推导是不合适的,因为 class 未根据您提供的信息完全定义.


其次,即使在 class 定义之外,auto m_pRecords = std::unique_ptr<CRecordset>; 表达式也是无效语法。 auto 关键字允许从作为其初始化给出的 表达式 的值推导出变量的类型(= 的右侧运算符)——以及类型名称 不是 表达式。


因此,作为解决方案,您应该像这样声明 class 的智能指针成员:

std::unique_ptr<CRecordset> m_pRecords;