在对copy-and-swap-idiom的漂亮回答中,有一段代码我需要一点帮助:
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?
swap
吗?它显然没有使用任何成员variables.
friend
的用武之地?次要问题:
对于带有C++11的
noexcept
swap
s吗?对于,我应该在类中以相同的方式放置friend iter begin()
和friend iter end()
吗?我认为这里不需要friend
,对吧?发布于 2011-04-18 02:41:20
该代码等同于(几乎在所有方面):
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
inline
确切的规则在[class.friend]
部分(我引用C++0x草案的第6和第7段):
当且仅当类是非本地类(9.8)、函数名未限定且函数具有命名空间作用域时,才能在类的友元声明中定义函数。
这样的函数是隐式内联的。在类中定义的友元函数在定义它的类的(词法)范围内。在类外部定义的友元函数不是。
https://stackoverflow.com/questions/5695548
复制相似问题