C++クイズ explicitコンストラクタ編

先輩から以下のような問題を出された。

【問題】
class MyClass {
public:
MyClass(int m_):m(m_) {} ;
private:
int m;
};
のようなクラスがある場合、

MyClass m1(0); // A
MyClass m2 = 0; // B
どっちの初期化もできちゃうよ。
この2つの違いはなーに?
どっちかしか使えない状況はある?

Aの場合は、普通にM(int m_)のコンストラクタが呼ばれて初期化が行われる。

Bの場合も、結果としては同じだけど、おそらく以下のような手順で初期化が行われる。

  1. 右辺値が一度 "M(0)" にキャストされ、
  2. private変数のmが0で初期化されたMクラスのインスタンスが生成され、
  3. 生成されたインスタンスが、Mクラスのデフォルトコピーコンストラクタでm2にコピーされる

M(int m_)のコンストラクタにexplicit宣言をつけた場合、Mのケースだとコンストラクタを明示しないといけないので、コンパイルエラーになるという話でいいんだろうか?

Cクイズ こっちわからん><

/* MyTypeの定義 */

void set(MyType m, int val);
void inc(MyType m);
void print(MyType m);

int main(void)
{
MyType m;
set(m, 0); /* mを0にセット */
inc(m); /* mをインクリメント */
print(m); /* 1と表示される */
return 0;
}

/* 各関数の実装 */

このmain関数が、コメントにある期待通り動くようにMyTypeを定義し、各関数を実装することができるか?
もちろん、mainの中身は変えないこと。そして、使えるのは、C言語の言語要素のみ。

???ポインタを渡せるように構造体をtypedefするのか???