这个问题最容易用一个例子来说明,所以去了:
是否可以保证像下面这样的代码有效,并且可以正确编译和运行?
(并非所有的实现实际上都能正确地编译它,但是我想知道这是否是一个错误。)

#include <algorithm>
class Picky
{
    friend
        Picky *std::copy<Picky const *, Picky *>(Picky const *, Picky const *, Picky *);
    Picky &operator =(Picky const &) { return *this; }
public:
    Picky() { }
};

int main()
{
    Picky const a;
    Picky b;
    std::copy<Picky const *, Picky *>(&a, &a + 1, &b);
    return 0;
}

最佳答案

std::copy需要输出迭代器([algorithms.general]/p5);输出迭代器尤其要求*r = o有效([output.iterators,表108])-不仅是“有时有效”或“在某些情况下有效”。

由于对于Picky *p, a;*p = a在大多数情况下无效,因此Picky *不是有效的输出迭代器。



与成员函数成为 friend 绝对是不可以,因为您甚至不能保证有一个带有该签名的成员函数([member.functions]/p2,Stephan T. Lavavej称之为"STL Implementers Can Be Sneaky Rule"):

关于c++ - C++标准库是否必须支持对 friend 是谁的挑剔类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30111320/

10-11 22:53