Is code like this supposed to work?

template <class T>

class A

{

T t_;

public:

void swap(A& y) noexcept(noexcept(swap(t_, y.t_)));

};

template <class T>

void

swap(A<T>& x, A<T>& y) noexcept(noexcept(x.swap(y)));

int main()

{

A<int> i, j;

swap(i, j);

}

It currently gives errors:

test.cpp:6:49: error: member access into incomplete type 'A<int>'

void swap(A& y) noexcept(noexcept(swap(t_, y.t_)));

^

test.cpp:15:12: note: in instantiation of template class 'A<int>' requested here

A<int> i, j;

^

test.cpp:2:7: note: definition of 'A<int>' is not complete until the closing '}'

class A

^

test.cpp:11:42: error: reference to local variable 'x' declared in enclosed function 'swap'

swap(A<T>& x, A<T>& y) noexcept(noexcept(x.swap(y)));

^

test.cpp:11:1: note: in instantiation of function template specialization 'swap<int>' requested here

swap(A<T>& x, A<T>& y) noexcept(noexcept(x.swap(y)));

^

test.cpp:11:12: note: 'x' declared here

swap(A<T>& x, A<T>& y) noexcept(noexcept(x.swap(y)));

^

2 errors generated.

I haven't looked at the language side to see if it is supposed to work. But there's library specs that implies it should work. I wouldn't be surprised if the library guys (myself included) just didn't understand the language. And if it isn't supposed to work, I can work around it easily enough.

Here's another variation that works around the first error, but the second remains:

#include <type_traits>

using std::swap;

template <class T>

class A

{

T t_;

public:

void swap(A& y) noexcept(noexcept(swap(std::declval<T&>(),

std::declval<T&>())));

};

template <class T>

void

swap(A<T>& x, A<T>& y) noexcept(noexcept(x.swap(y)));

int main()

{

A<int> i, j;

swap(i, j);

}

test.cpp:16:42: error: reference to local variable 'x' declared in enclosed function 'swap'

swap(A<T>& x, A<T>& y) noexcept(noexcept(x.swap(y)));

^

test.cpp:16:1: note: in instantiation of function template specialization 'swap<int>' requested here

swap(A<T>& x, A<T>& y) noexcept(noexcept(x.swap(y)));

^

test.cpp:16:12: note: 'x' declared here

swap(A<T>& x, A<T>& y) noexcept(noexcept(x.swap(y)));

^

1 error generated.

Just wanted to check here first in case it was a bug.

Howard