C++ における X(){} と X() = default; の違い

LingrC++ 部屋で

struct X{
    X(){}
};

struct X{
    X() = default;
};

との違いはなんだろう、みたいな話で盛り上がっていたので覚書。
結論からいうと以下のような感じらしい。
http://gyazo.com/061f3ce52ea4c28a3c2000e3340791ee.png
http://lingr.com/room/cpp/archives/#message-19090582


要は X(){} はコンストラクタの定義だけど X() = default; は宣言であって定義ではない、って感じみたいです。
shiracha さんも言っていましたが、デフォルトで constexpr が定義される場合は X() = default; も constexpr で宣言されることになったりします。
あとは uniform initialization は X() = default; では定義できますが、X(){} ではエラーになるというのもありますね。

struct X{
    X() = default;

    int a;
    float b;
};

// OK
auto x = X{42, 3.14f};


struct X2{
    X(){}

    int a;
    float b;
};

// Error
auto x2 = X2{42, 3.14f};