c++ - 对于使用输出参数函数来初始化 const 成员的构造函数中的调用,代码比 lambda 更简单

标签 c++ c++11 lambda initialization constants

在标题中,我有

class CSomeClass
{
    const GUID m_guid;

public:
    CSomeClass();
///...
}

并在源文件中

CSomeClass::CSomeClass()
    , m_guid(
        []() {
        GUID g;
        ::CoCreateGuid(&g);
        return g;
        }()
    )
{
}

如您所知,Guids 可以用作不需更改的标识。鉴于 ::CocreateGuid() 函数提供了我想要的输出参数,而不是返回它,我不能直接使用对该函数的简单调用来初始化 m_guid 成员字段(即常量)。

因此,其常量性的结果是它必须在初始化程序列表中的左括号之前初始化,因此不能简单地通过调用构造函数中的 ::CocreateGuid() 进行分配 body 。

有没有比这个 lambda 表达式更简单的初始化方法?

最佳答案

当 lambda 表达式正确时,我将使用辅助函数:

GUID create_guid()
{
    GUID g;
    ::CoCreateGuid(&g);
    return g;
}

CSomeClass::CSomeClass() : m_guid(create_guid()) {}

此外,create_guid() 本身具有含义并且可以重用(即使将其作为实现细节是可能/正确的)。

关于c++ - 对于使用输出参数函数来初始化 const 成员的构造函数中的调用,代码比 lambda 更简单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31078201/

相关文章:

c++ - 我应该使用 std::for_each 吗?

c++ - 模板类型推导

c++ - 警告已弃用的从字符串常量到 char * 的转换

c++ - c++中非void return函数模板的显式方法

c++ - 两个按钮一个窗口

c++ - 为什么不基于 const range 来使用 const_iterator?

java - docs.oracle.com lambda 表达式示例无法编译

c++ - std::swap 在 VS 2013 中导致无限递归

c++ - 同一个库在16.04下和14.04下定义了不同的符号

c# - 为什么在 Lambda 表达式中使用方法?