反転攻勢のきっかけは、2010年（平成22年）7月の第22回参院選である。自民に代わって第一党となった民主党に加え、社会民主党（社民党、代表・福島瑞穂）・国民新党（代表・亀井静香）が連立を組み、民主党代表・鳩山由紀夫を首相とする民社国連立政権としてスタートしたものの、鳩山由紀夫内閣の失政と崩壊、続く菅直人の失言などに助けられて、自民党は51議席を獲得し、改選第一党となり与党の参院過半数獲得を阻止した。2011年（平成23年）9月2日、菅内閣（→1次改造→2次改造）は東日本大震災（同年3月11日発生の東北地方太平洋沖地震による）の対応不手際などで総辞職。代わって野田佳彦が首相となったものの、野田内閣（→1次改造→2次改造→3次改造）は発足当初から閣僚の不祥事や離党者が連発し、民主党は分裂寸前であった。2012年（平成24年）9月の総裁選で安倍晋三が返り咲きを果たすと、野田との党首討論で解散総選挙の言質を引き出すことに成功する。12月、第46回衆院選で民主党は大敗、自民党は絶対安定多数を超える294議席を獲得（その後鳩山邦夫が復党し295人）、公明党も31議席を獲得し、3年3か月ぶりに与党復帰を果たした。同月25日、自由民主党総裁・安倍晋三は公明党代表・山口那津男と連立合意文書を交換。自公連立が3年3ヶ月ぶりに復活する事になり、12月26日、野田第3次改造内閣総辞職、第2次安倍内閣が発足した。以降、鳩山由紀夫、菅直人、野田佳彦と三人続けて短命政権に終わった民主党は党勢を政権獲得前にまで回復させることができず、低迷している。また、中堅野党の日本維新の会やみんなの党なども分裂・解党を繰り返しており、野党は停滞状況にある。そのため、2013年（平成25年）の第23回参院選で公明党と合わせて過半数割れを解消、2014年（平成26年）の第47回衆院選でも現有議席をほぼ維持するなど、与党優位の体制は継続している。
コンセプトが記載された最後の規格書ドラフトである N2914 の記述に基づいて説明する。コンセプトは、名前付きの構造であり、型が提供しなければならない機能を指定する。この点は、オブジェクト指向プログラミングで、型の行えることの制限の定義を基底クラスにより行うのに似ている。しかしオブジェクト指向プログラミングとは違い、コンセプトの定義自体にはテンプレートに渡される型が明示的に関連付けられず、テンプレート定義の側で結びつけられる:template<LessThanComparable T>const T& min(const T &x, const T &y){  return x < y ? x : y;}テンプレート型引数にclassやtypenameを使い任意の型と指定するのではなく、前方で定義されたコンセプトであるLessThanComparableを使用している。テンプレート関数minに渡された型がコンセプトLessThanComparableを満たさない場合、コンパイルエラーとなり、テンプレート実体化に使われた型がLessThanComparableコンセプトに適合しなかったことが報告される。より一般的なコンセプトの使用の記法は、以下のようになる:template<typename T> requires LessThanComparable<T>const T& min(const T &x, const T &y){  return x < y ? x : y;}requiresキーワードの後には、コンセプト宣言のリストが続く。これにより、複数の型を使うコンセプトを使用できる。また、requires !LessThanComparable<T>のように用いることも出来、あるコンセプトに合致する型の使用を禁止することが出来る。これらの機能は、テンプレートの特殊化と同様の方法で使用できる。一般的なテンプレートを少ない機能しか使わないものとして定義し、さらに多機能なコンセプトを用いた特殊化を用意することで、その機能を用いて高いパフォーマンスや高機能性を実現できる。コンセプトは以下のように定義される:auto concept LessThanComparable<typename T>{  bool operator<(T, T);}この例に含まれているキーワードautoは、コンセプトに記述された操作を提供するあらゆる型がコンセプトを満たすこととする、ということを示すものである。autoキーワードが無い場合、コンセプトを満たす型を宣言するのにコンセプトマップを使う必要がある。このコンセプトは、「自身と同じ型の引数を二つ取り、boolを返す演算子 < を持つあらゆる型はLessThanComparableである」ということを示している。演算子は大域関数ではなく、型Tのメンバ関数でなくてはならない。コンセプトは、複数の型を含むことも出来る。例えば、二つの型をとり、片方がもう片方の型へと変換できる、ということを表すコンセプトは:auto concept Convertible<typename T, typename U>{  operator U(const T&);}これをテンプレートで使うためには、コンセプトの一般的使用の記法を使う必要がある:template<typename U, typename T> requires Convertible<T, U>U convert(const T& t){  return t;}コンセプトは複合できる。例えば、Regularというコンセプトが与えられている場合:concept InputIterator<typename Iter, typename Value>{  require Regular<Iter>;  Value operator*(const Iter&);  Iter& operator++(Iter&);  Iter operator++(Iter&, int);}InputIteratorコンセプトに渡されたテンプレート引数の一つ目は、Regularコンセプトを満たすことが確認される。継承を行うように、コンセプトも他のコンセプトから派生できる。そして、クラスの継承のように、派生コンセプトも基底コンセプトの要件を満たす。派生コンセプトは、クラスの派生のように定義される:concept ForwardIterator<typename Iter, typename Value> : InputIterator<Iter, Value>{  //ここに他の要件を追記する。}コンセプトに型名 (typename)を結び付けることもできる。これにより、型名が使用可能であることをコンセプトの要件として表現できる:concept InputIterator<typename Iter>{  typename value_type;  typename reference;  typename pointer;  typename difference_type;  require Regular<Iter>;  require Convertible<reference, value_type>;  reference operator*(const Iter&); // デリファレンス  Iter& operator++(Iter&);          // 前置インクリメント  Iter operator++(Iter&, int);      // 後置インクリメント  // ...}