首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >公共好友交换成员函数

公共好友交换成员函数
EN

Stack Overflow用户
提问于 2011-04-18 02:35:03
回答 1查看 33.9K关注 0票数 192

在对copy-and-swap-idiom的漂亮回答中,有一段代码我需要一点帮助:

代码语言:javascript
复制
class dumb_array
{
public:
    // ...
    friend void swap(dumb_array& first, dumb_array& second) // nothrow
    {
        using std::swap; 
        swap(first.mSize, second.mSize); 
        swap(first.mArray, second.mArray);
    }
    // ...
};

他加了一张便条

还有其他主张,我们应该为我们的类型指定std:: swap,提供类内交换以及自由函数交换,等等。但这都是不必要的:交换的任何正确使用都将通过非限定调用,我们的函数将通过ADL找到。一个函数就可以了。

我必须承认,在使用friend时,我有点“不友好”。所以,我的主要问题是:

静态函数喜欢自由函数,但它在类body?

  • why里面,不就是swap 吗?它显然没有使用任何成员variables.

  • "Any正确使用交换将发现通过ADL"?ADL将搜索名称空间,对吗?但是它是否也在类内部进行查看呢?或者这就是friend的用武之地?

次要问题:

对于带有C++11的

  • ,我应该用noexcept
  • With C++11及其范围来标记我的swaps吗?对于,我应该在类中以相同的方式放置friend iter begin()friend iter end()吗?我认为这里不需要friend,对吧?
EN

回答 1

Stack Overflow用户

发布于 2011-04-18 02:41:20

该代码等同于(几乎在所有方面):

代码语言:javascript
复制
class dumb_array
{
public:
    // ...
    friend void swap(dumb_array& first, dumb_array& second);
    // ...
};

inline void swap(dumb_array& first, dumb_array& second) // nothrow
{
    using std::swap; 
    swap(first.mSize, second.mSize); 
    swap(first.mArray, second.mArray);
}

在类中定义的友元函数是:

放在封闭的namespace

  • automatically inline

  • able中的
  • ,用于引用类的静态成员,而无需进一步限定

确切的规则在[class.friend]部分(我引用C++0x草案的第6和第7段):

当且仅当类是非本地类(9.8)、函数名未限定且函数具有命名空间作用域时,才能在类的友元声明中定义函数。

这样的函数是隐式内联的。在类中定义的友元函数在定义它的类的(词法)范围内。在类外部定义的友元函数不是。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5695548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档