c++ - 参数语法

标签 c++ syntax

我遇到了这个示例类 http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/sp_techniques.html#as_lock我正在为语法而苦苦挣扎。

class shared_lock
{

private:

    shared_ptr<void> pv;

public:

    template<class Mutex> explicit shared_lock(Mutex & m): pv((m.lock(), &m), mem_fn(&Mutex::unlock)) {}
};

我(相信我)理解除了“(m.lock(), &m)”这部分以外的所有内容。整个事情似乎是初始化智能指针的第一个参数。该复合语句的计算结果是什么?它只是m的地址吗?为什么把锁作为参数列表的一部分放在那里(它是如何合法的)?相反,我会期待这样的声明:

template<class Mutex> explicit shared_lock(Mutex & m): pv(&m, mem_fn(&Mutex::unlock)) {m.lock();}

我的替代语句是否改变了功能?

最佳答案

What does that compound statement evaluate to? Is it simply the address of m?

Why is the lock placed there as part of the parameter list (and how is it legal)?

构造函数需要获取锁,这是放置它的一个方便的地方。否则必须在构造函数的主体中设置共享指针。

这是合法的,因为在初始化程序中使用了表达式,包括逗号运算符。需要额外的括号来消除逗号运算符与逗号分隔参数的歧义,但除此之外,大多数任何表达式都是允许的。

关于c++ - 参数语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11233447/

相关文章:

c++ - unique_ptr<T>.get() 方法在使用原始指针分配时调用析构函数?

c++ - 表达式不能用作宏扩展中的函数

c++ - 模板化类和处理不需要的类型声明的良好实践

c++ - 构造函数:被调用的是正确的吗?

c++ - 如何将输入作为字符串并将每个字符识别为 char、int 或 float?

c++ - 为什么模板只能在头文件中实现?

c# - 如何使 Visual Studio 在 C# 代码中自动包含大括号?

javascript - 为什么在对象字面量赋值后不插入分号?

java - 什么是 [Android] Java 的 VB.NET 静态关键字?

PHP5 - 赋值运算结果不被解析器视为对象