#include <type_traits>

template<class F, class S>
struct pair_base {
	template<bool true_ = true
	        ,typename std::enable_if
	         <   std::is_default_constructible<F>::value
	          && std::is_default_constructible<S>::value
	          && true_
	         , int
	         >::type = 0
	        >
	pair_base() : first(), second() {}
	F first;
	S second;
};

template<class F, class S>
struct pair : private pair_base<F,S> {
	using pair_base<F,S>::first;
	using pair_base<F,S>::second;
};

static_assert(std::is_default_constructible<pair<int,int>>::value, "");
static_assert(!std::is_default_constructible<pair<int&,int&>>::value, "");

int main() {}
