引数にconstが付いている意味は?

CreateProcessWの第2引数に文字列リテラルを渡すと死ぬ!
確かに「なんでconst付いてないんだろ」と思ったことがあった気がする。
愚直に非constを守るか、さもなくば突っ込んで調べるべきだった。
が、ここで、自分はconstの意味を誤解していたことに気づいた。
例えば、void hoge(const char *) に文字列のポインタを渡すとする。
このconstの意味は、「文字列を渡しても変更されてしまう心配はないですよ」
だと思っていた。
constが付いていない場合は、「変更される恐れがある」と受け取っていた。
が、そのconstには「書き込み不可のメモリも渡せる」という意味もあった。
つまり、constが付いていないときには、「変更されて困るか」だけではなく、
「その領域は書き込み可か」という確認もする必要があったのだ。
しかし、LPCTSTRを渡してコンパイルエラーになるのは当然として、
文字列リテラルを渡しても警告すら出してくれないのはどうなんだ。
(文字列リテラルを書き換えたときの動作は未定義らしい)