No. esplicitamente concetti non sono autorizzati a essere amici.
n4377 7.1.7/2
Ogni definizione concetto viene implicitamente definito come una dichiarazione constexpr (7.1.5). Una definizione di concetto non deve essere dichiarata con gli specificatori thread_local, inline, friend o constexpr, né una definizione di concetto associata a vincoli (14.10.2).
possiamo ridurlo a questo esempio per dimostrare che l'accesso è realmente il problema:
template <typename T>
concept bool Fooable = requires (T t) { { t.f() } -> void };
struct Foo
{
private:
void f() {}
};
int main()
{
static_assert(Fooable<Foo>, "Fails if private");
}
È possibile comunque utilizzare un livello di indirezione, qualcosa di simile:
template <typename T>
void bar(T t) { t.f(); }
template <typename T>
concept bool FooableFriend = requires(T t) { { bar(t) } -> void };
struct Foo
{
private:
void f() {}
template<typename T>
friend void bar(T t);
};
int main()
{
static_assert(FooableFriend<Foo>, "");
}
Live demo incorporating your example
Quali lavori. I concetti sono abbastanza precoci, quindi immagino che potrebbero sollevare la limitazione friend
proprio come le proposte hanno revocato le restrizioni per le funzionalità di C++ 11/14 in passato.
fonte
2016-05-18 10:40:20