While the result of a lambda expression is move constructible it isn't necessarily move assignable and certainly not copyable. I would just bypass the problem by using a std::reference_wrapper<decltype(comp)>
for the comparator object:
typedef pair<int,float> ifpair;
auto comp = []( ifpair a, ifpair b ) { return a.second > b.second; };
typedef priority_queue< ifpair , vector<ifpair>,
std::reference_wrapper<decltype( comp ) >> t_npq;
t_npq npq( std::ref(comp) );
t_npq empty( std::ref(comp) );
swap(npq , empty);
Since the full type information of the lambda expression is retained by the reference wrapper, this should work even if the closure isn't empty and, where viable, it should be possible to inline the function.